0

Ich verwende android.support.design.widget.TabLayout für Tabbed-Ansicht. Unten ein Teil meines Codes. Das Problem ist, dass die Liste nach dem Drehen Bildschirm korrekt neu erstellt wird, aber wenn ich die Suche drücken Sie die Taste auf Suche dann wird listFrag.onSearchTextEntered genannt und ich Ausnahme, dass tvEmptyView ist null:Android SearchView und TabLayout-Ansicht ist null nach Rotation und Erholung

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setVisibility(int)' on a null object reference 
    at com.app.ListFrag.onSearchTextEntered(ListFrag.java:117) 
    at android.support.v7.widget.SearchView.onTextChanged(SearchView.java:1150) 
    at android.support.v7.widget.SearchView.access$2000(SearchView.java:103) 
    at android.support.v7.widget.SearchView$12.onTextChanged(SearchView.java:1680) 
    .................. 

Linie 117 ist „tvEmptyView.setVisibility (Ansicht. WEG);" Aber wie ist es möglich, dass tvEmptyView null ist, wenn es in OnCreateView-Methode gefunden wird? Vor dem Drehen SearchView funktioniert gut und tvEmptyView ist nicht null!

public class MainActivity extends AppCompatActivity { 
ListFrag listFrag; 

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

    Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar); 
    TabLayout tabLayout = (TabLayout)findViewById(R.id.tabLayout); 
    ViewPager tabPager = (ViewPager)findViewById(R.id.tabPager); 

    setSupportActionBar(toolbar); 

    tabAdapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    MapFrag mapFrag = new MapFrag(); 
    listFrag = new ListFrag(); 
    tabAdapter.addFragment(mapFrag, "MAP"); 
    tabAdapter.addFragment(listFrag, "LIST"); 
    tabPager.setAdapter(tabAdapter); 
    tabPager.setOffscreenPageLimit(3); 
    tabLayout.setupWithViewPager(tabPager); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main_menu, menu); 
    MenuItem myActionMenuItem = menu.findItem(R.id.action_search); 
    SearchView searchView = (SearchView) myActionMenuItem.getActionView(); 
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String query) { 
     listFrag.onSearchTextEntered(query); 
     return false; 
     } 
     @Override 
     public boolean onQueryTextChange(String query) { 
     listFrag.onSearchTextEntered(query); 
     return false; 
     } 
    }); 
    return true; 
} 

} 

Liste Fragment Code:

public class ListFrag extends Fragment { 
RecyclerView recyclerView; 
TextView tvEmptyView; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.list_fragment, container, false);   
    recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); 
    tvEmptyView = (TextView) view.findViewById(R.id.tvEmptyView); 
    createRecyclerView(); 
    return view; 
} 
private void createRecyclerView() { 
    listAdapter = new MyListAdapter(getActivity(), new ArrayList<MyData>(), this); 
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 
    recyclerView.setAdapter(listAdapter); 
}  
public void onSearchTextEntered(String text) { 
    //filter data basing on entered text 
    //............................ 
    if (listAdapter == null) 
    createRecyclerView(); 
    listAdapter.setList(busStops); 
    if (busStops.size() == 0) 
    tvEmptyView.setVisibility(View.VISIBLE); 
    else 
    tvEmptyView.setVisibility(View.GONE); 
} 
} 

list_fragment.xml:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recyclerView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:scrollbars="vertical" /> 

    <TextView 
     android:id="@+id/tvEmptyView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:text="@string/no_results" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:visibility="gone" /> 

</FrameLayout> 

A versucht, Textview innen auf onSearchTextEntered für Test zu finden:

tvEmptyView = (TextView) getView().findViewById(R.id.tvEmptyView); 

und ich andere Ausnahme, die ge tView() ist null !! Ich weiß nicht, was los ist ... wie getView() kann Null sein, wenn Ansicht und Liste (Recycler-Ansicht), wenn angezeigt, ok?

+0

ersetzt So Versuchen onCreateView Ansicht Typ zurückzukehren. Ich sehe nicht in deinem Code. – phongvan

+0

Schreiben Sie 'return view' am Ende von' onCreateView'. –

+0

@phongvan Sorry, ich habe zu viel vom Code entfernt, aber es ist wieder da. Gerade bearbeiteter Beitrag. – user3626048

Antwort

0

Es könnte möglich sein, da Ansicht nicht gefunden wird, während Ausrichtung geändert

tvEmptyView = (TextView) view.findViewById(R.id.tvEmptyView); 
to 
tvEmptyView = (TextView) getView().findViewById(R.id.tvEmptyView); 
+0

nur überprüft, aber immer noch das gleiche Problem. überprüfe auch, was passiert, wenn ich tvEmptyView = (TextView) getView(). findViewById (R.id.tvEmptyView) vor dem Ort anrufe, an dem Exception ausgelöst wird (vor tvEmptyView.setVisibility (....)) und andere Exception java.lang bekomme .NullPointerException: Es wurde versucht, die virtuelle Methode 'android.view.View android.view.View.findViewById (int)' für eine Nullobjekt-Referenz aufzurufen !! Ich weiß nicht, was los ist ... wie getView() kann Null sein wenn Liste (recycler view) wenn angezeigt ok? – user3626048