2017-09-29 42 views
1

でNPEを取得しました。断片化したSearchView(アクティビティのメニューが膨れている)

/res/menu/order_toolbar.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 

<item 
    android:id="@+id/order_menu_search" 
    android:icon="@drawable/ic_search" 
    android:title="@string/order_menu_search" 
    app:actionViewClass="android.support.widget.v7.SearchView" 
    app:showAsAction="ifRoom|withText" /> 

<item 
    android:id="@+id/order_menu_checkmark" 
    android:icon="@drawable/ic_checkmark" 
    android:title="@string/order_toolbar" 
    app:showAsAction="ifRoom|withText" /> 

ActivityOrder.java

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.order_toolbar, menu); 
    mMenuCheckmark = menu.findItem(R.id.order_menu_checkmark); 
    mMenuCheckmark.setVisible(false); 
    return super.onCreateOptionsMenu(menu); 
} 

FragmentOrder.java

@Override 
public void onPrepareOptionsMenu(Menu menu){ 
    MenuItem menuItem = menu.findItem(R.id.order_menu_search); 
    SearchView searchView = (SearchView) menuItem.getActionView(); 
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String query) { 
      return false; 
     } 

     @Override 
     public boolean onQueryTextChange(String newText) { 
     Toast.makeText(getActivity(), "" +newText, Toast.LENGTH_SHORT).show(); 
      return false; 
     } 
    }); 
} 

私はActivityのメニューを膨らませています(チェックマークを非表示にして、ユーザーが入力をした後、すべてのロジックがアクティビティになった後で有効にする必要があります)、フラグメント内にはRecyclerViewがあります。検索(ツールバー内)。だから、基本的に、私はそれにアクセスする必要がありますSearchView断片のみ。 私は何も見つけようとしていませんが何も助けません。をfragmentに入れて膨張させると、toolbarのアイコンが2倍になります。

setHasOptionsMenu(true); 

既にonCreate

で添加される。また、私はこれを試みた: 1. 2.私はバックアクティビティトラフインターフェースへのmenuItem(チェックマーク)を通過した(活性onCreateOptionsMenu除去)断片のメニューを膨らまチェックマークにアクセスできます 3. searchviewでリスナーを設定するとNPEが表示されます

+1

implements SearchView.OnQueryTextListenerを追加しました。 onPrepareOptionsMenuではありません – amuyu

+0

私が既に言ったように、私がFragmentで膨らませると、私は二重のアイコンを得ます。フラグメントの目的は、アクティビティーからシリアライズ可能なリストを取得し、RecyclerViewのアダプターに渡すことです(Firebaseの値に基づいて異なるタイプのオーダーを表示する必要があるため) – fkvestak

+0

フラグメントでオプションメニューを作成できます。 Fragmentで 'setHasOptionsMenu(true)'を使用します。 – amuyu

答えて

0

:あなたは、あなたがonCreateOptionsMenuでコードを書くことができた場合は

mMenuSearch = (SearchView) menu.findItem(R.id.order_menu_search).getActionView(); 
     mMenuSearch.setOnQueryTextListener(this); 

は、フラグメントおよび2つの新しいオーバーライドメソッドonQueryTextSubmitonQueryTextChanged

0

フラグメント内にオプションメニューを作成します。このように、

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 
         @Nullable Bundle savedInstanceState) { 
... 
setHasOptionsMenu(true); 
... 
} 


@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    super.onCreateOptionsMenu(menu, inflater); 
    inflater.inflate(R.menu.fragment_menu, menu); 
    menu.findItem(R.id.menu_1).setIcon(ContextCompat.getDrawable(activity, R.drawable.ic_bar_search)); 
    searchView = (SearchView) menu.findItem(R.id.menu_1).getActionView(); 
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String s) { 
      return false; 
     } 

     @Override 
     public boolean onQueryTextChange(String s) { 
      return false; 
     } 
    }); 
    searchView.setOnCloseListener(new SearchView.OnCloseListener() { 
     @Override 
     public boolean onClose() { 
      return false; 
     } 
    }); 
.... 
} 

わからない、あなたはonCreateOptionsMenuから "searchView.setOnQueryTextListener" と呼んでいます。解決

+0

しかし、断片化したメニューを膨らませると、どのようにしてアクティビティのmenuitem(チェックマーク)への参照が得られますか? – fkvestak

+0

私は自分の質問を編集しましたが、断片化してしまいました(アクティビティから削除しました)が、SearchView、NPEから参照を取得できません。 – fkvestak

+0

"onPrepareOptionsMenu"で呼び出さないでください。 "onCreateOptionsMenu"で呼び出す – amuyu

関連する問題