Ответ 1
Вы можете получить представление, используя идентификатор элемента меню, получив его в onOptionsItemSelected
..
findViewById(R.id.menu_item);
У меня есть PopupWindow
, который я хочу привязать к элементу меню панели действий, но не могу, так или иначе, получить View
элемента, который я хочу щелкнуть.
Это необходимо для метода PopupWindow
showAsDropDown()
.
Кто-нибудь знает, как достичь этого?
Вы можете получить представление, используя идентификатор элемента меню, получив его в onOptionsItemSelected
..
findViewById(R.id.menu_item);
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, здесь.
Я также встречаю эту проблему, 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 не завышено, поэтому должен выполняться в потоке пользовательского интерфейса
Каждый вызов:
activity.findViewById(R.id.menu_item);
Если ваш код внутри фрагмента не используется:
getView().findViewById(R.id.menu_item);
Он вернет null.