Я использую 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() может быть пустым, если вид и список (просмотр ресайклера), если отображается нормально?
onCreateView вернуться Просмотр типа. Я не вижу в вашем коде. – phongvan
Напишите 'return view' в конце' onCreateView'. –
@phongvan Извините, я слишком много удалил из кода, но вернулся. Просто отредактированный пост. – user3626048