Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

Android Build a Blog Reader Android App Using Intents to Display and Share Posts Opening a Webpage in the Browser

Edward Poon
Edward Poon
9,313 Points

ListItemLink won't open

I created the Intent and everything but when I click the link item, it doesn't open up the browser window to the link.

package com.teamtreehouse.blogreader;

import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.HashMap;

import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject;

import android.app.AlertDialog; import android.app.ListActivity; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.text.Html; import android.util.Log; import android.view.MenuItem; import android.view.View; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast;

import com.treamtreehouse.blogreader.R;

public class MainListActivity extends ListActivity {

//protected String[] mBlogPostTitles;
public static final int NUMBER_OF_POSTS = 32;
public static final String TAG = MainListActivity.class.getSimpleName();
protected JSONObject mBlogData; 
protected ProgressBar mProgressBar;
private final String KEY_TITLE = "title";
private final String KEY_AUTHOR = "author";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_list);
    mProgressBar = (ProgressBar)findViewById(R.id.progressBar1);
    if(isNetworkAvailable()){
         mProgressBar.setVisibility(View.VISIBLE);
         GetBlogPostsTask getBlogPostsTask = new GetBlogPostsTask();
         getBlogPostsTask.execute();
    }
    else{
        Toast.makeText(this, "Network is unavailable!", Toast.LENGTH_LONG).show();
    }

    /*Posts the array elements in the strings.xml onto the list*/
    //Resources resources = getResources();
    //mBlogPostTitles = resources.getStringArray(R.array.android_names);
    //ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mBlogPostTitles);
    //setListAdapter(adapter);
    //Toast.makeText(this, getString(R.string.no_items), Toast.LENGTH_LONG).show();

}

protected void OnListItemClick(ListView l, View v, int position, long id){
    super.onListItemClick(l, v, position, id);
    JSONArray jsonPosts;
    try {
        jsonPosts = mBlogData.getJSONArray("posts");
        JSONObject jsonPost = jsonPosts.getJSONObject(position);
        String blogUrl = jsonPost.getString("url");
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse(blogUrl));
        startActivity(intent);
    } catch (JSONException e) {
        logException(e);
    }
}

private void logException(JSONException e) {
    Log.e(TAG, "Exception caught!:", e);
}
private boolean isNetworkAvailable() {
    ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = manager.getActiveNetworkInfo();
    boolean isAvailable = false;
    if(networkInfo != null && networkInfo.isConnected()){
        isAvailable = true;
    }
    return isAvailable;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}
public void handleBlogResponse() {
    mProgressBar.setVisibility(View.INVISIBLE);
    if(mBlogData == null){
        updateDisplayForError();    
    }
    else{
        try {
            JSONArray jsonPosts = mBlogData.getJSONArray("posts");
            ArrayList<HashMap<String, String>> blogPosts = new ArrayList<HashMap<String, String>>();
            //mBlogPostTitles = new String[jsonPosts.length()];
            for(int i = 0; i < jsonPosts.length(); i++){
                JSONObject post = jsonPosts.getJSONObject(i);
                String title = post.getString(KEY_TITLE);
                title = Html.fromHtml(title).toString();
                String author = post.getString(KEY_AUTHOR);
                author = Html.fromHtml(author).toString();
                HashMap<String, String> blogPost = new HashMap<String, String>();
                blogPost.put(KEY_TITLE, title);
                blogPost.put(KEY_AUTHOR, author);
                blogPosts.add(blogPost);
                //mBlogPostTitles[i] = title;
            }
            String[] keys = { KEY_TITLE, KEY_AUTHOR };
            int[] ids = { android.R.id.text1, android.R.id.text2  };
            SimpleAdapter adapter = new SimpleAdapter(this, blogPosts, android.R.layout.simple_expandable_list_item_2, keys, ids);
            //ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mBlogPostTitles);
            setListAdapter(adapter);
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            logException(e);
        }
    }
}


private void updateDisplayForError() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(getString(R.string.error_title));
    builder.setMessage(getString(R.string.error_message));
    builder.setPositiveButton(android.R.string.ok, null);
    AlertDialog dialog = builder.create();
    dialog.show();

    TextView emptyTextView = (TextView)getListView().getEmptyView();
    emptyTextView.setText(getString(R.string.no_items));
}
//First parameter is the types passed into the GetBlogPost Tasks
//Second parameter is the type of progress units if we don't care put Void
//Third parameter is the return type of the GetBlogPostTask
private class GetBlogPostsTask extends AsyncTask<Object, Void, JSONObject>{

    //Runs in another thread that's not the main thread.
    //Objects... means that we can put 0 or more arguments into it. 
    @Override
    protected JSONObject doInBackground(Object... params) {
        int responseCode = -1;
        JSONObject jsonResponse = null;
        try {
            URL blogFeedUrl = new URL("http://blog.teamtreehouse.com/api/get_recent_summary/?count=" + NUMBER_OF_POSTS);
            HttpURLConnection connection = (HttpURLConnection)blogFeedUrl.openConnection();
            connection.connect();
            responseCode = connection.getResponseCode();
            if(responseCode == HttpURLConnection.HTTP_OK){
                InputStream inputStream = connection.getInputStream();
                Reader reader = new InputStreamReader(inputStream);
                int contentLength = connection.getContentLength();
                char[] charArray = new char[contentLength];
                reader.read(charArray);
                String responseData = new String(charArray);
                jsonResponse = new JSONObject(responseData);

// String status = jsonResponse.getString("status"); //
// JSONArray jsonPosts = jsonResponse.getJSONArray("posts"); //
// for(int i = 0; i < jsonPosts.length(); i++){ // JSONObject jsonPost = jsonPosts.getJSONObject(i); // String title = jsonPost.getString("title"); // Log.v(TAG, "Post " + i + ": " + title); // } } else{ Log.i(TAG, "Unsuccessful HTTP Response Code " + responseCode); } Log.i("TAG", "Code " + responseCode); } catch (MalformedURLException e) { // TODO Auto-generated catch block Log.e(TAG, "Exception caught: ", e); } catch (IOException e){ Log.e(TAG, "Exception caught: ", e); } catch (Exception e){ Log.e(TAG, "Exception caught: ", e); } return jsonResponse; }

    //on post execute runs on the main thread
    @Override
    protected void onPostExecute(JSONObject result){
        mBlogData = result;
        handleBlogResponse();
    }

}

}

1 Answer

you need to change this line
Intent intent = new Intent(Intent.ACTION_VIEW); to Intent intent = new Intent(this, BlogWebViewActivity.class); in your OnListItemClick method.

Edward Poon
Edward Poon
9,313 Points

Thanks for the input but in that specific video, he didn't use the BlogWebActivity.