2016-11-04 10 views
-1

In einer App mit mehreren Tabs, ich eine erweiterbare Listview und eine Suchansicht in einer der Registerkarten (Tab2) hinzugefügt. Ich hatte einen Fehler auf getComponentName() als nicht für Fragment unterstützt .So habe ich getActivity(). GetComponentName() hinzugefügt. Es gibt keine Fehler aber NullpointerException, wenn es in dieser Zeile ausgeführt wird. Die App stürzt ab. Irgendwelche Ideen?
Hier sind die wichtigen Linien Code:getActivity(). GetComponentName() in Fragment 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); 

} 

und die Aktivität:

<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> 

+0

Mögliches Duplikat von [Was ist eine NullPointerException und wie behebe ich sie?] (Http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) –

+0

können Sie Absturzprotokolle – Sanjeet

+0

java.lang.NullPointerException bei com.example.orestis.myapp.Tab2.onCreateView (Tab2.java:34) bei android.support.v4.app.Fragment.performCreateView (Fragment.java hinzufügen : 2080) Zeile 34 ist search.setSearchableInfo (searchManager.getSearchableInfo (getActivity(). GetComponentName())); – Orestis

Antwort

4

In Fragment Lifecycle getActivity() aufgerufen werden, nach Aktivität erzeugt wird. getActivity wird nach onActivityCreated verfügbar sein.

Sie können getActivity nicht in onCreateView-Code verwenden.

+0

Zunächst einmal vielen Dank für die Antwort :) geschätzt! Also, wenn ich es nicht verwenden kann, wo ich GetComponentName() implementieren muss, um ordnungsgemäß zu funktionieren? Muss ich onActivityCreated anstelle von OnCreateView überschreiben? – Orestis

+0

Da Ihr Code Aktivitätsinformationen benötigt, ist es besser, Code in onActivityCreated zu verschieben. –

0

yo lo resolví con este artículo https://es.stackoverflow.com/questions/108085/agregar-menu-de-accion-en-un-fragmento-android-studio Me Quedo así: // En el onCreate de mi fragmento agregué

setHasOptionsMenu(true); 

/// En el onCreateOptionsMenu del fragmento lo reemplazé 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; 
     } 
    }); 


} 

// Y añadí en el 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); 
} 
+0

Brauchen Sie bitte eine englische Antwort. –

+0

// In der onCreate meines Fragments habe ich /// Auf dem Fragment OnCreateOptionsMenu Ich ersetzte es durch // Und ich fügte das Fragment hinzu –

Verwandte Themen