Android: получить ссылку на пункт меню

Я планирую использовать шаблон быстрого действия UI в своем приложении. Android Быстрые действия UI Pattern . Окно быстрого действия нуждается в представлении pivot, чтобы придерживаться.

    quickAction.show(View pivotView);

Я намерен использовать быстрое действие для пункта меню, я могу получить доступ к элементу, который нажат. Но проблема в том, что мне нужно ссылаться на представление из пункта меню, чтобы я мог передать его в быстрое действие.

Как я могу получить ссылку на представление в меню, которое выбранный.

7 ответов


вы можете достичь этого, предоставив свой пункт меню свойством actionViewClass в xml, а затем вы сможете получить сводный вид u хотел. Код будет примерно таким:

<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;
}

старый вопрос, но я столкнулся с некоторыми проблемами с . Для всех, кто столкнется с этим позже...

вызов findViewById(R.id.mnu_item) на onOptionsItemSelected вернет View якорь.

QuickActions на MenuItems не очень хороший дизайн, но я обнаружил, что они являются самым простым способом реализации подменю с пользовательским фоном.


Inorder to получить справочные виды пунктов меню мы должны сделать это,

@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;
}

обновление для тех, кто хочет найти пункт меню " Вид " по другим причинам (как я хотел).

Если у вас есть доступ и использовать панель инструментов 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...
            }
        }
    }
}

в основном классе activity лучше всего переопределить 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
}

Вы можете получить ссылку на пункт меню, как это:

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

а затем делайте с ним все, что хотите. Е. Г. изменить его значок такой:

btnFavorites.setIcon(R.drawable.ic_favorite_false); 

внутри onOptionsItemSelected просто получить представление с помощью идентификатора.

посмотреть menuItemView = команду findViewById(Р. ИД.action_sort);

теперь вы можете использовать это представление в соответствии с вашим требованием.