其中一种方法(假设我们使用工具栏) - 这个示例应该让您了解如何实现长按工具栏按钮:
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);
ps。您还可以将 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) {
/** 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,但它仍然不起作用。没有任何改变。 – SuperThomasLab
是的 - 但我知道它在你的情况下不起作用的原因??? - 在我的示例中,我们检查是否布局了视图项,而不是如果布局了菜单视图则进行更改,然后检查菜单是否包含项目
这里有工作代码供你学习:
https://github.com/c3ph3us/LongClickOnMenuItem
回复其他cmets:
@ SuperThomasLab 我不明白为什么 setOnLongClickListener(...) 方法对您不可用。 ——侯赛因·赛菲
@HosseinSeifi - 看看 android.view.MenuItem 接口 - 它没有提供这样的方法 - 所以对于优秀的程序员来说这应该是显而易见的 :) 为什么他无法实现类方法.