0

Я использую android.support.design.widget.TabLayout для просмотра с вкладками. Ниже часть моего кода. Проблема заключается в том, что после поворота экрана списка правильно воссоздана, но при нажатии кнопки на SearchView поиска затем listFrag.onSearchTextEntered называется, и я получаю исключение, что tvEmptyView является нулевым:Android SearchView и TabLayout вид null после ротации и отдыха

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

Линия 117 является «tvEmptyView.setVisibility (вид. ПРОШЛО);" Но как возможно, что tvEmptyView является нулевым, если он найден в методе onCreateView? Прежде чем поворачивать SearchView работает нормально, а tvEmptyView не равно нулю!

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

} 

Список фрагмент кода:

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> 

испытанный найти TextView внутри на onSearchTextEntered для теста:

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

и я получаю другое исключение, что ge tView() имеет значение null! Я не знаю, что происходит ... как getView() может быть пустым, если вид и список (просмотр ресайклера), если отображается нормально?

+0

onCreateView вернуться Просмотр типа. Я не вижу в вашем коде. – phongvan

+0

Напишите 'return view' в конце' onCreateView'. –

+0

@phongvan Извините, я слишком много удалил из кода, но вернулся. Просто отредактированный пост. – user3626048

ответ

0

Это может быть возможно, потому что вид не найден в то время как ориентация изменилась, Так Попробуйте заменить

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

только что проверил, но все тот же вопрос. также проверьте, что произойдет, если я вызову tvEmptyView = (TextView) getView(). findViewById (R.id.tvEmptyView) до того места, где выбрано Exception (до tvEmptyView.setVisibility (....)), и я получаю другое исключение java.lang .NullPointerException: попытка вызвать виртуальный метод 'android.view.View android.view.View.findViewById (int)' в ссылке на нулевой объект !! Я не знаю, что происходит ... как getView() может быть пустым, если список (просмотр recycler), если отображается нормально? – user3626048

Смежные вопросы