Tzen Szen
Tzen Szen

Reputation: 35

Error: Content view not yet created

I'm new to Android development and I have a problem with setting up getting into the next activity when I click an item in my listview within my ListFragment.

When I compile and run the app, it crashes with the error: Content view not yet created. Here is the relevant code. Any help would be much appreciated!

MainActivity:

package com.example.szen95.meddict;


import android.app.SearchManager;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.SearchView;


public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new SearchFragment())
                .commit();
    }

    getSupportActionBar().setElevation(0f);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_main, menu);

    SearchManager searchManager = (SearchManager) getSystemService( Context.SEARCH_SERVICE );
    SearchView searchView = (SearchView) menu.findItem( R.id.search_bar ).getActionView();

    searchView.setSearchableInfo( searchManager.getSearchableInfo( getComponentName() ) );

    return super.onCreateOptionsMenu(menu);
}

@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.
               return super.onOptionsItemSelected(item);
    }
}

SearchFragment:

package com.example.szen95.meddict;


/**
 * Created by szen95 on 6/15/15.
 */


import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

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

import java.util.ArrayList;
import java.util.HashMap;

/**
 * A placeholder fragment containing a simple view.
 */
public class SearchFragment extends ListFragment {

    private ProgressDialog pDialog;

    // URL to get contacts JSON
    private static String url = "http://dailymed.nlm.nih.gov/dailymed/services/v2/drugclasses.json";

    // JSON Node names
    private static final String TAG_DATA = "data";
    private static final String TAG_CODE = "code";
    private static final String TAG_CODING_SYSTEM = "codingSystem";
    private static final String TAG_TYPE = "type";
    private static final String TAG_NAME = "name";


    // contacts JSONArray
    JSONArray data = null;
//    ArrayAdapter<String> mConditionsAdapter;

    public SearchFragment() {
    }

    ArrayList<HashMap<String, String>> dataList;

    @Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container,
                             Bundle savedInstanceState) {

        dataList = new ArrayList<HashMap<String, String>>();


        // Creating view correspoding to the fragment
        View v = inflater.inflate(R.layout.fragment_main, container, false);


        ListView lv = getListView();

        // Listview on item click listener
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                // getting values from selected ListItem
                String name = ((TextView) view.findViewById(R.id.name))
                        .getText().toString();
                String code = ((TextView) view.findViewById(R.id.code))
                        .getText().toString();

                // Starting single contact activity
                Intent in = new Intent(getActivity().getApplicationContext(),
                        Details.class);
                in.putExtra(TAG_NAME, name);
                in.putExtra(TAG_CODE, code);
                startActivity(in);

            }
        });


        new GetData().execute();

        return v;
    }


    /**
     * Async task class to get json by making HTTP call
     * */
    private class GetData extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Showing progress dialog
            pDialog = new ProgressDialog(getActivity());
            //
            pDialog.setMessage("Please wait...");
            pDialog.setCancelable(false);
            pDialog.show();

        }
        @Override
        protected Void doInBackground(Void... arg0) {
            // Creating service handler class instance
            ServiceHandler sh = new ServiceHandler();

            // Making a request to url and getting response
            String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);

            Log.d("Response: ", "> " + jsonStr);

            if (jsonStr != null) {
                try {
                    JSONObject jsonObj = new JSONObject(jsonStr);

                    // Getting JSON Array node
                    data = jsonObj.getJSONArray(TAG_DATA);

                    // looping through All Contacts
                    for (int i = 0; i < data.length(); i++) {
                        JSONObject c = data.getJSONObject(i);

                        String code = c.getString(TAG_CODE);
                        String codingSystem = c.getString(TAG_CODING_SYSTEM);
                        String type = c.getString(TAG_TYPE);
                        String name = c.getString(TAG_NAME);


                        // tmp hashmap for single contact
                        HashMap<String, String> data = new HashMap<String, String>();

                        // adding each child node to HashMap key => value
                        data.put(TAG_CODE, code);
                        data.put(TAG_CODING_SYSTEM, codingSystem);
                        data.put(TAG_TYPE, type);
                        data.put(TAG_NAME, name);

                        // adding contact to contact list
                        dataList.add(data);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            } else {
                Log.e("ServiceHandler", "Couldn't get any data from the url");
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            // Dismiss the progress dialog
            if (pDialog.isShowing())
                pDialog.dismiss();
            /**
             * Updating parsed JSON data into ListView
             * */
            SimpleAdapter adapter = new SimpleAdapter(getActivity(), dataList,
                    R.layout.list_item_search, new String[] { TAG_NAME, TAG_CODE}, new int[] { R.id.name,
                    R.id.code});

            setListAdapter(adapter);
        }

    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


        setHasOptionsMenu(true);
    }
//
//    @Override
//    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
//        inflater.inflate(R.menu.menu_main, menu);
//
//
//    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_about) {
//            FetchDataTask defTask = new FetchDataTask();
//            defTask.execute();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

Details:

package com.example.szen95.meddict;


import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuInflater;
import android.widget.TextView;




public class Details extends ActionBarActivity {


// JSON node keys
private static final String TAG_NAME = "name";
private static final String TAG_CODE = "code";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_details);

    // getting intent data
    Intent in = getIntent();

    // Get JSON values from previous intent
    String name = in.getStringExtra(TAG_NAME);
    String code = in.getStringExtra(TAG_CODE);

    // Displaying all values on the screen
    TextView lblName = (TextView) findViewById(R.id.name_label);
    TextView lblCode = (TextView) findViewById(R.id.code_label);

    lblName.setText(name);
    lblCode.setText(code);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_main, menu);

    return onCreateOptionsMenu(menu);
}
}

Upvotes: 0

Views: 609

Answers (1)

Bob Snyder
Bob Snyder

Reputation: 38299

SearchFragment extends ListFragment. In a ListFragment, getListView() cannot be called in onCreateView(), because onCreateView() is creating the fragment's content view and has not yet completed. The call to getListView() in SearchFragment is the cause of the exception.

Move the the call to getListView() and related to code to one of the fragment lifecycle methods that is called after onCreateView(), such as onViewCreated() or onActivityCreate(). For example:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    ListView lv = getListView();

    // Listview on item click listener
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
            // getting values from selected ListItem
            String name = ((TextView) view.findViewById(R.id.name))
                    .getText().toString();
            String code = ((TextView) view.findViewById(R.id.code))
                    .getText().toString();

            // Starting single contact activity
            Intent in = new Intent(getActivity().getApplicationContext(),
                    Details.class);
            in.putExtra(TAG_NAME, name);
            in.putExtra(TAG_CODE, code);
            startActivity(in);

        }
    });
}

Upvotes: 1

Related Questions