错误:尚未创建内容视图

时间:2015-06-27 14:35:48

标签: android

我是Android开发的新手,当我在ListFragment中单击listview中的项目时,我遇到设置进入下一个活动的问题。

当我编译并运行应用程序时,它崩溃并出现错误:尚未创建内容视图。这是相关的代码。任何帮助将非常感激!

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);
    }
}

详细信息:

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);
}
}

1 个答案:

答案 0 :(得分:1)

SearchFragment扩展了ListFragment。在ListFragment中,无法在onCreateView()中调用onCreateView(),因为getListView()正在创建片段的内容视图,但尚未完成。 SearchFragment中对getListView()的调用是异常的原因。

将对onCreateView()的调用与代码相关的调用移至onViewCreated()之后调用的片段生命周期方法之一,例如onActivityCreate()@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); } }); } 。例如:

{{1}}