getActivity()。getComponentName()into Fragment Nullpointerexception

时间:2016-11-04 15:26:23

标签: android android-fragments nullpointerexception searchview

在一个多选项卡应用程序中,我在其中一个选项卡中添加了一个可扩展的列表视图和一个搜索视图(Tab2)。我在getComponentName()上有一个错误,因为它不支持fragment.So我添加了getActivity()。getComponentName ()。在此行上运行它时没有错误但是NullpointerException。应用程序崩溃。任何想法?
以下是代码的重要部分:

public class Tab2 extends Fragment implements SearchView.OnQueryTextListener,SearchView.OnCloseListener{
private SearchView search;
private MylistAdapter listAdapter;
private ExpandableListView myList;
private ArrayList<Continent> continentList = new ArrayList<Continent>();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.tab2, container, false);
    SearchManager searchManager = (SearchManager)  getActivity().getSystemService(Context.SEARCH_SERVICE);
    search = (SearchView) getActivity().findViewById(R.id.search);
    search.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));
    search.setIconifiedByDefault(false);
    search.setOnQueryTextListener(this);
    search.setOnCloseListener(this);

    displayList();
    expandAll();
    return rootView;
}



private void expandAll(){

    int count = listAdapter.getGroupCount();
    for (int i=0; i<count; i++)
    {
        myList.expandGroup(i);
    }
}

private void displayList() {

    // display the list
    loadSomeData();

    // get reference to the ExpandableListView
    myList = (ExpandableListView) getView().findViewById(R.id.expandableList);
    // create the adapter by passing your ArrayList data
    listAdapter = new MylistAdapter(getActivity(), continentList);
    // attach the adapter to the list
    myList.setAdapter(listAdapter);

}

和活动:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >

<SearchView
    android:id="@+id/search"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true" />

<ExpandableListView
    android:id="@+id/expandableList"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/search" >
</ExpandableListView>

2 个答案:

答案 0 :(得分:5)

在Fragment生命周期中,可以在创建Activity之后调用getActivity()。在onActivityCreated之后,getActivity将可用。

您不能在onCreateView代码中使用getActivity。

答案 1 :(得分:0)

yoloresolvíconesteartículohttps://es.stackoverflow.com/questions/108085/agregar-menu-de-accion-en-un-fragmento-android-studio 我quedóasí: // En el onCreate de mi fragmentagregué

setHasOptionsMenu(true);

/// En el onCreateOptionsMenu del fragmentoloremplazécon

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


    // Associate searchable configuration with the SearchView
    SearchManager searchManager = (SearchManager) getContext().getSystemService(Context.SEARCH_SERVICE);
    searchView = (SearchView) menu.findItem(R.id.action_search)
            .getActionView();
    searchView.setSearchableInfo(searchManager
            .getSearchableInfo(getActivity().getComponentName()));
    searchView.setMaxWidth(Integer.MAX_VALUE);

    // listening to search query text change
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            // filter recycler view when query submitted
            mAdapter.getFilter().filter(query);
            return false;
        }

        @Override
        public boolean onQueryTextChange(String query) {
            // filter recycler view when text is changed
            mAdapter.getFilter().filter(query);
            return false;
        }
    });


}

//Yañadíenel framento

@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();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_search) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}