0

タブ付きビューでは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になることがありますか?

+0

を交換してみてください 、可能かもしれません。私はあなたのコードで表示されません。 – phongvan

+0

'onCreateView'の最後に' return view'を書いてください。 –

+0

@phongvan申し訳ありませんが、コードからあまりにも多くを削除しましたが、リターンがあります。ちょうど編集されたポスト。 – user3626048

答えて

0

向きを変えながらビューが見つからないので、それはそうビュー型を返すonCreateView

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

がチェックされていますが、同じ問題があります。 (tvEmptyView.setVisibility(....)の前に)例外がスローされる場所の前にtvEmptyView =(TextView)getView()。findViewById(R.id.tvEmptyView)を呼び出し、他のException java.lang .NullPointerException:ヌルオブジェクトリファレンスで仮想メソッド 'android.view.View android.view.View.findViewById(int)'を呼び出そうとしました!私は何が起こっているのかわからない...どのようにgetView()リスト(リサイクルビュー)が表示されたら、nullになる可能性がありますか? – user3626048

関連する問題