タブ付きビューではandroid.support.design.widget.TabLayoutを使用しています。私のコードのいくつかの部分の下。問題は、画面のリストを回転させた後、正しく再作成されますが、私はSearchViewの検索ボタンを押したときにlistFrag.onSearchTextEnteredが呼び出されると、私はtvEmptyViewがNULLであること例外を得ることです: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(図です。 GONE); " しかし、tvEmptyViewは、それがonCreateViewメソッドで見つかった場合、どのようにnullになる可能性がありますか?回転する前にSearchViewが正常に動作していて、tvEmptyViewが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;
}
}
一覧断片コード:
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:
tvEmptyView = (TextView) getView().findViewById(R.id.tvEmptyView);
と私が手:
<?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は、テストのために内部onSearchTextEntered上のTextViewを見つけることを試みましたその他の例外ge tView()がnullです!私は何が起こっているのかわからない...どのようにgetView()ビューとリスト(リサイクルビュー)が表示されたら、nullになることがありますか?
を交換してみてください 、可能かもしれません。私はあなたのコードで表示されません。 – phongvan
'onCreateView'の最後に' return view'を書いてください。 –
@phongvan申し訳ありませんが、コードからあまりにも多くを削除しましたが、リターンがあります。ちょうど編集されたポスト。 – user3626048