один из многих способов (при условии, что мы используем панель инструментов) - этот пример должен дать вам представление о том, как реализовать долгое нажатие на кнопку панели инструментов:
class MyActivity extends Activity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
/** get menu inflater */
MenuInflater menuInflater = getMenuInflater();
/** Inflate the menu
* this adds items to the action bar if it is present. */
menuInflater.inflate(R.menu.menu_home, menu);
/** find interesting item */
MenuItem item = menu.findItem(R.id.itemId);
/** set action view */
item.setActionView(new ImageButton(this)); // this is a Context.class object
/** set listener on action view */
item.getActionView().setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return false;
}
});
return super.onCreateOptionsMenu(menu);
}
}
в методе onCreateOptionsMenu — или любом другом методе, когда вы можете получить ссылку на элемент меню (пропустите шаги 1-2):
- создать меню / например, надуть
- получить пункт меню
- создать представление действия, например ImageButton
- установить прослушиватель длинного щелчка в представлении действия
- установить в пункте меню вид действия
выше я установил представление действия, затем я возвращаю его из пункта меню и устанавливаю прослушиватель (порядок не имеет значения, он может быть и таким образом):
ImageButton imageButton = new ImageButton(Context);
imageButton.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return false;
}
});
item.setActionView(imageButton);
пс. вы также можете установить представление изображения в xml в качестве атрибута пункта меню:
<item
...
android:actionViewClass="android.widget.ImageButton"
/>
then you can get the action view by cast
View menuItemActionView = menu.findItem(R.id.itemId).getActionView();
if(menuItemActionView != null
&& ImageButton.class.isAssignableFrom(menuItemActionView.getCLass())) {
ImageButton imageButton = (ImageButton) menuItemActionView;
}
Но затем вы устанавливаете прослушиватель длинных кликов только для представления действия, а не для всего элемента. – СуперТомасЛаб
-- нет, вы устанавливаете представление действия для одного элемента, в этом случае вы меняете представление по умолчанию (на виджет ImageButton) для пункта меню - представление действия может быть простым или сложным типом представления
Но что, если вы не хотите менять представление, а хотите оставить представление по умолчанию? – СуперТомасЛаб
пример (это один из многих способов использования наблюдателя дерева макета/установки прослушивателя изменения макета):
private View.OnLongClickListener onLongClickListener = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return false;
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
/** get menu inflater */
MenuInflater menuInflater = getMenuInflater();
/** Inflate the menu
* this adds items to the action bar if it is present. */
menuInflater.inflate(R.menu.menu_home, menu);
/** geta menu item using findItem(int itemid) */
MenuItem item = menu.findItem(R.id.itemLogOut);
/** check if we have item */
if(item!=null) {
/** try get its action view */
View actionView = item.getActionView();
/** check if action view is already set? */
if(actionView==null) {
/** get item id to comparte later in observer listener*/
final int itemId = item.getItemId();
/** if not set on top most window an layout changes listener */
getWindow().getDecorView()
.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right,
int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
/** try get view by id we have stored few line up */
View viewById = v.getRootView().findViewById(itemId);
/** check if we have any result */
if(viewById!=null) {
/** set our listener */
viewById.setOnLongClickListener(onLongClickListener);
/** remove layout observer listener */
v.removeOnLayoutChangeListener(this);
}
}
});
} else {
/** if set we can add our on long click listener */
actionView.setOnLongClickListener(onLongClickListener);
}
}
}
Я пробовал использовать OnLayoutChangeListener, но он по-прежнему не работает. Ничего не изменилось. – СуперТомасЛаб
ДА ЭТО ДЕЛАЕТ - но я знаю причину, по которой это не работает в вашем случае??? - в моем примере мы проверяем, выложен ли элемент просмотра вместо этого изменения, если вид меню выложен, а затем проверяем, содержит ли меню элемент
вот рабочий код для изучения:
https://github.com/c3ph3us/LongClickOnMenuItem
в ответ на другие комментарии:
@ SuperThomasLab Для меня не очевидно, почему метод setOnLongClickListener(...) недоступен для вас. – Хоссейн Сейфи
@HosseinSeifi - посмотрите на интерфейс android.view.MenuItem - он не предоставляет такой метод - так что для хорошего программиста это должно быть очевидно :) почему он не может реализовать метод класса.
person
ceph3us
schedule
18.06.2016
MenuItem
, а не наListView
... - person Thomas Vos   schedule 19.06.2016