web-dev-qa-db-ja.com

Android:メニュー項目へのビュー参照を取得

アプリケーションでクイックアクションUIパターンを使用する予定です。 AndroidクイックアクションUIパターン クイックアクションウィンドウには、固定するピボットビューが必要です。

    quickAction.show(View pivotView);

メニュー項目にクイックアクションを使用する予定で、クリックされた項目にアクセスできます。しかし、問題は、クイックアクションにビューを渡すことができるように、メニュー項目からビューを参照する必要があることです。

選択されているmenuItemのビューへの参照を取得するにはどうすればよいですか。

48
Yashwanth Kumar

これを実現するには、メニュー項目にxmlのactionViewClassプロパティを指定します。そうすると、必要なピボットビューを取得できます。コードは次のようになります

<item
    Android:id="@+id/menu_find"
    Android:showAsAction="ifRoom"
    Android:actionViewClass="Android.widget.ImageButton"
    />

OnCreateOptionsMenuでこれを行います

public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    getMenuInflater().inflate(R.menu.menu_search, menu);
    locButton = (ImageButton) menu.findItem(R.id.menu_find).getActionView();
    locButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            createPopup();
            mQuickAction.show(v);
        }
    });
    return true;
}
92
ASH

古い質問ですが、actionViewClass属性にいくつかの問題が発生しました。後でこれに遭遇した人のために...

onOptionsItemSelectedfindViewById(R.id.mnu_item)を呼び出すと、Viewアンカーが返されます。

QuickActions上のMenuItemsは良い設計ではありませんが、カスタム背景を使用してサブメニューを実装する最も簡単な方法であることがわかりました。

37
loadedion

メニュー項目の参照ビューを取得にするには、これを行う必要があります。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.section, menu);

    new Handler().post(new Runnable() {
        @Override
        public void run() {

            final View menuItemView = findViewById(R.id.action_preview);
            // SOME OF YOUR TASK AFTER GETTING VIEW REFERENCE

        }
    });


    return true;
}
6
jazzbpn

他の理由で(私が望んでいたように)メニュービュー項目を見つけたい人のための更新。

AppCompatのツールバーにアクセスして使用する場合は、方法があります。これは最も効率的な方法ではありませんが、メニュー項目のビューにアクセスするために見つけた最も簡単な方法です。

public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);

    // Find Menu
    for (int toolbarChildIndex = 0; toolbarChildIndex < toolbar.getChildCount(); toolbarChildIndex++) {
        View view = toolbar.getChildAt(toolbarChildIndex);

        // Found Menu
        if (view instanceof ActionMenuView) {
            ActionMenuView menuView = (ActionMenuView) view;

            // All menu items
            for (int menuChildIndex = 0; menuChildIndex < menuView.getChildCount(); menuChildIndex++) {
                ActionMenuItemView itemView = (ActionMenuItemView) menuView.getChildAt(menuChildIndex);
                // Do something to itemView...
            }
        }
    }
}
3

メインアクティビティクラスでは、onOptionsItemSelected(...)メソッドをオーバーライドするのが最適です。以下のようなものでなければなりません:

public boolean onOptionsItemSelected(MenuItem item) {
  // the id is of type int
  int someId = item.getItemId();
  // can use an if() or switch() statement to check if id is selected
  //a Toast message can be used to show item is selected
}
0
odins

次のようなメニュー項目への参照を取得できます。

MenuItem btnFavorites = menu.findItem(R.id.action_favorite);

そして、あなたがそれを使って何でもやります。例えば。アイコンを次のように変更します。

btnFavorites.setIcon(R.drawable.ic_favorite_false); 
0
Ivo Stoyanov