Подтвердить что ты не робот

Получить представление из пункта меню панели действий.

У меня есть PopupWindow, который я хочу привязать к элементу меню панели действий, но не могу, так или иначе, получить View элемента, который я хочу щелкнуть. Это необходимо для метода PopupWindow showAsDropDown().

Кто-нибудь знает, как достичь этого?

4b9b3361

Ответ 1

Вы можете получить представление, используя идентификатор элемента меню, получив его в onOptionsItemSelected..

findViewById(R.id.menu_item);

Ответ 2

findViewById не нужно запускать onOptionsItemSelected, чтобы получить представление о действии.

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

Итак, как вы можете это сделать?

здесь пример кода:

public boolean onCreateOptionsMenu(final Menu menu) {
  getSupportMenuInflater().inflate(R.menu.main, menu);
  new Handler().post(new Runnable() {
    @Override
    public void run() {
      final View menuItemView = findViewById(R.id.menu_action_item);
      ...

это было протестировано при использовании библиотеки actionBarSherlock, на android 4.1.2 и android 2.3.5.

другой альтернативой является использование более обширного способа, используемого в библиотеке showcaseView, здесь.

Ответ 3

Я также встречаю эту проблему, findViewById должен работать на моей стороне, вот пример кода:

private void setDrawable(final Menu menu) {
    if (menu == null || menu.size() == 0) return;

    Utils.postToUiHandler(new Runnable() {
        @Override
        public void run() {
            int size = menu.size();
            for (int i = 0; i < size; i++) {
                MenuItem menuItem = menu.getItem(i);
                if (menuItem != null) {
                    View view = activity.findViewById(menuItem.getItemId());
                    if (view != null) {
                        Drawable drawable = ThemeDrawables.get(ThemeWorker.Segment.DEFAULT).actionbarButton();
                        if (drawable != null && view.getBackground() != drawable) {
                            int sdk = android.os.Build.VERSION.SDK_INT;
                            if (sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
                                view.setBackgroundDrawable(drawable);
                            } else {
                                view.setBackground(drawable);
                            }
                        }

                    }
                }
            }
        }
    });

}

Обратите внимание: я делаю findViewById в потоке пользовательского интерфейса, так как представление menuitem не завышено, поэтому должен выполняться в потоке пользовательского интерфейса

Ответ 4

Каждый вызов:

activity.findViewById(R.id.menu_item);

Если ваш код внутри фрагмента не используется:

getView().findViewById(R.id.menu_item); 

Он вернет null.