使用工具栏的众多方法之一(假设我们使用Toolbar)- 这个示例应该让您了解如何在工具栏按钮上实现长按:
class MyActivity extends Activity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.menu_home, menu);
MenuItem item = menu.findItem(R.id.itemId);
item.setActionView(new ImageButton(this));
item.getActionView().setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return false;
}
});
return super.onCreateOptionsMenu(menu);
}
}
在方法
onCreateOptionsMenu - 或者任何你能获取菜单项引用的方法(省略步骤1-2) 中:
- 创建菜单,例如通过inflate方式
- 获取菜单项
- 创建动作视图,例如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;
}
但是,您仅将长按侦听器设置为操作视图,而不是整个项目。 – SuperThomasLab
-- 否,您是在单个元素上设置操作视图 在这种情况下,您更改了菜单项的默认视图(到 ImageButton 小部件)- 操作视图可以是简单或复杂的视图类型。
但是,如果您不想更改视图,而是保留默认视图呢? – SuperThomasLab
例如 (这是许多方法之一通过使用布局树观察器 / 通过设置布局更改侦听器):
private View.OnLongClickListener onLongClickListener = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return false;
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.menu_home, menu);
MenuItem item = menu.findItem(R.id.itemLogOut);
if(item!=null) {
View actionView = item.getActionView();
if(actionView==null) {
final int itemId = item.getItemId();
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) {
View viewById = v.getRootView().findViewById(itemId);
if(viewById!=null) {
viewById.setOnLongClickListener(onLongClickListener);
v.removeOnLayoutChangeListener(this);
}
}
});
} else {
actionView.setOnLongClickListener(onLongClickListener);
}
}
}
我尝试了OnLayoutChangeListener,但它仍然不起作用。没有任何变化。- SuperThomasLab
是的,它可以工作 - 但我知道为什么在你的情况下它不起作用??? - 在我的示例中,我们检查视图项目是否已布局,而不是更改菜单视图是否已布局,然后检查菜单是否包含项目
这是适合你学习的工作代码:
https://github.com/c3ph3us/LongClickOnMenuItem
回复其他评论:
@ SuperThomasLab,对我来说,setOnLongClickListener(...)方法为什么不可用并不明显。- Hossein Seifi
@HosseinSeifi - 看看 android.view.MenuItem 接口 - 它没有提供这样的方法 - 所以对于优秀的程序员来说,这应该是显而易见的 :) 他为什么不能达到实现类方法。