2016-05-01 3 views
0

私は自分のナビゲーションドロワーのMenuItems(コンテキストメニューからアイテムを選択するために動的に作成されたリストを表示するために)を開きたいと思います。しかし、どのビューをregisterForContextMenuに使用するかを知ることはできません。openContextMenuに手動で渡すビューもわかりません(たとえば、コンテキストメニューをワンクリックで表示したい場合など)。単にMenuItem識別子を使用すると、Viewにキャストできないため、機能しません。では、ここでコンテキストメニューを使用するにはどうすればいいですか?ナビゲーションドロワーのMenuItemにコンテキストメニューを作成するにはどうすればよいですか?

+0

が、これは宿題/アプリの作品のいくつかの並べ替えですか?私はずっと前とまったく同じ質問を見ました。私は他の質問と同じアドバイスをして、あなたのロジックを再考してください:メニュー項目のコンテキストメニューを起動するべきではありません。これは大多数のユーザーが期待するものではないからです。 – Luksprog

+0

私は、アクションバーのメニュー項目について同じことについてユーザーが議論しているのを見てきました。だから、なぜドロワーメニュー項目に対して同じことをやってみませんか? 開発中の誰もが本格的なAndroidの専門家ではないことを考慮してください(宿題の代わりに「実際の」アプリで作業することで挑戦する人もいるかもしれません)。アプローチはここに役立つ?私はサブメニューを使ってみましたが、ここでいくつかの記事を読んで理解できれば、私は簡単に展開/再展開できないので、引き出しメニューは永続的に開いているサブメニューでは手に入らなくなります。 – urps

+0

ウィジェットはウィジェットのために作られたものではないため(アプリを介したナビゲーションの提供や、ContextMenuのような任意のものを表示しないなど)、これをお勧めします。代わりに、あなたが提供した小さな情報からNavigationViewをExpandableListViewに置き換えることをお勧めします。この方法では、 "メインオプション"(現在のメニューオプション)と、ユーザーがそれらをクリックすると子ビューを表示しますあなたのデータのリスト)は、あなたがデータを表示する方法にいくつかの構造を提供します。 – Luksprog

答えて

0

これを実行する方法の1つは、コンテキストメニューのNavigationView全体を登録し、アイテムをクリック/ロングクリックしたときに手動で呼び出す前に内部メンバー変数に保存して選択したmenuItemを追跡することですNavigationViewのopenContextMenu。それで、私が実際にコンテキストメニューを必要とするMenuItemsに対してのみ、onCreateContextMenuを実装することができます。

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.top_menu, menu); 
    NavigationView nav_draw = (NavigationView) findViewById(R.id.nav_view); 
    if (nav_draw != null) { 
     registerForContextMenu(nav_draw); 
    } 
    return true; 
} 

私はメンバ変数

私はいつでも「面白い」メニューのどれもが、アイテムはnullに保つ
private MenuItem _lastNavDrawerMenuItemSelected = null; 

を紹介:

は具体的には、私はこのようなコンテキストメニューの引き出しを登録

が選択されている場合は、呼び出すメニュー項目を保存し、コンテキストメニューを手動で開きます。

public void inflateSubMenu(MenuItem item) { 
    NavigationView v = (NavigationView) findViewById(R.id.nav_view); 
    if (v != null) { 
     _lastNavDrawerMenuItemSelected = item; 
     openContextMenu(v); 
    } 
} 
onCreateContextMenu

は、私が唯一の希望のMenuItemが処理を受けることを確認して、NavigationViewとgroupIditemIdとして現在のMenuItemのIDを渡すと、nullに戻って内部メンバ変数を設定します。

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 
    if (v.getId() == R.id.nav_view) { 
     if (_lastNavDrawerMenuItemSelected != null) { 
      if (_lastNavDrawerMenuItemSelected.getItemId() == R.id.my_submenu_item_id) { 
       menu.setHeaderTitle(...); 
       menu.add(v.getId(),_lastNavDrawerMenuItemSelected.getItemId(), Menu.NONE, <ENTRY TITLE>); 
       ... 
      } 
      _lastNavDrawerMenuItemSelected = null; 
     } 
    } 
} 

を最後に、私は(コンテキストメニューが構築されたために、私はのMenuItemに設定)groupId(私は上記NavigationViewに設定されている)とitemIdに基づいて必要な措置を実施:

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    if (item.getGroupId() == R.id.nav_view) { 
     if (item.getItemId() == R.id.my_submenu_item_id) { 
      ... 
     } 
    } 
    return true; 
} 
関連する問題