Android: получить представление Ссылка на пункт меню - PullRequest
47 голосов
/ 23 декабря 2011

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

    quickAction.show(View pivotView);

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

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

Ответы [ 7 ]

91 голосов
/ 02 марта 2012

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

<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;
}
36 голосов
/ 18 апреля 2013

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

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

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

5 голосов
/ 01 января 2018

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;
}
3 голосов
/ 09 сентября 2016

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

Если у вас есть доступ к панели инструментов 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...
            }
        }
    }
}
0 голосов
/ 12 февраля 2018

Внутри onOptionsItemSelected просто получите представление, используя идентификатор.

View menuItemView = findViewById (R.id.action_sort);

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

0 голосов
/ 05 января 2018

Вы можете получить ссылку на пункт меню следующим образом:

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

А потом делай с ней что хочешь. Например. измените его значок следующим образом:

btnFavorites.setIcon(R.drawable.ic_favorite_false); 
0 голосов
/ 05 марта 2017

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