#java #android #menuitem #onlongclicklistener
#java #Android #menuitem #onlongclicklistener
Вопрос:
У меня есть типичное меню, и я хочу установить a onLongClickListener
для одного из элементов. Другими словами, я хочу, чтобы этот элемент выполнял свою обычную onOptionsItemSelected
функцию, а также функцию длительного нажатия.
MenuItem item;
item = menu.findItem(android.R.id.home);
item.setOnLongClickListener(new OnLongClickListener() {
public boolean onLongClick(View v) {
Context context = getApplicationContext();
CharSequence text = "Long Press";
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, text, duration);
toast.show();
return true;
}
});
Ответ №1:
Я смог сделать это, просто используя setActionView в MenuItem. Вы можете выполнить эту процедуру, если это поможет.
for(int i = 0; i < menu.size(); i ){
View v = new View(this);
v.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
//Your longclick listener callback logic goes here
return false;
}
});
menu.getItem(i).setActionView(v);
}
Ответ №2:
Используйте findItem
метод on, Menu
чтобы получить ваши представления, и установите прослушиватель длинных кликов для каждого представления.
Комментарии:
1. нет, в объекте Menu есть метод с именем FindItem . Используйте это, чтобы получить представление, и установите прослушиватель длинных нажатий на представление.
2. Я получаю ту же ошибку. Этот OnLongClickListener не определен в MenuItem. Можете ли вы предложить больше помощи?
3. Извините, вам нужен дескриптор представления. Попробуйте getActionView() в пункте меню.
4. Я все еще не совсем освоился с этим, но спасибо, что помогли мне.
5. И getActionView(), конечно, возвращает null, потому что в моем пункте меню нет представления действий.. Вопрос OP заключается в том, как зафиксировать длительное нажатие в MenuItem, а не в actionview элемента меню.
Ответ №3:
Этот подход неправильный, он нарушает весь поток, но вот и все:
private interface OnMenuItemLongClickListener{
boolean onMenuItemLongClik(MenuItem m);
}
private void getMenuItemsView(Activity a, final Menu m, final OnMenuItemLongClickListener listener) throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
View homeButton = a.findViewById(android.R.id.home);
ViewParent parentOfHome = homeButton.getParent().getParent(); //ActionBarView is parent of home ImageView, see layout file in sources
if (!parentOfHome.getClass().getName().contains("ActionBarView")) {
parentOfHome = parentOfHome.getParent();
Class absAbv = parentOfHome.getClass().getSuperclass(); //ActionBarView -> AbsActionBarView class
Field actionMenuPresenterField = absAbv.getDeclaredField("mActionMenuPresenter");
actionMenuPresenterField.setAccessible(true);
Object actionMenuPresenter = actionMenuPresenterField.get(parentOfHome);
Field actionMenuViewField = actionMenuPresenter.getClass().getSuperclass().getDeclaredField("mMenuView");
actionMenuViewField.setAccessible(true);
Object actionMenuView = actionMenuViewField.get(actionMenuPresenter);
Field childrenField= actionMenuView.getClass().getSuperclass().getSuperclass().getDeclaredField("mChildren");
childrenField.setAccessible(true);
Field menuField =actionMenuPresenter.getClass().getSuperclass().getDeclaredField("mMenu");
menuField.setAccessible(true);
Object menu = menuField.get(actionMenuPresenter);
Object[] menuItemsAsViews = (Object[])childrenField.get(actionMenuView);
View.OnLongClickListener longListener = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return listener.onMenuItemLongClik(m.findItem(v.getId()));
}
};
for(Object menuView:menuItemsAsViews ){
View v = (View)menuView;
v.setOnLongClickListener(longListener);
}
}
}
Использование:
@Override
public boolean onPrepareOptionsMenu(final Menu menu) {
new Handler().postDelayed(new Runnable(){
@Override
public void run() {
getMenuItemsViews(MainActivity.this, menu);
}}, 100); //must be called after the menu views are generated, otherwise NPE.
return super.onPrepareOptionsMenu(menu);
}
WILL NOT
Следует учитывать элементы меню в переполнении.