的许多方面(假设我们使用的工具栏)一个 - 这个例子应该给你的想法如何实现工具栏上的按钮,长按:
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
是它 - 但我知道为什么it't是不是在你的情况下工作的原因??? - 在我的例子中,我们检查,如果视图项目布局而不是改变,如果菜单视图布局,然后检查是否菜单包含项目
这里工作代码为你学习:
https://github.com/c3ph3us/LongClickOnMenuItem
在回答其他评论:
@ SuperThomasLab这不是对我来说显而易见的,为什么setOnLongClickListener(...)方法不适用于你。 - 侯赛因Seifi
@HosseinSeifi - 看android.view.MenuItem界面 - 它并没有提供这样的方法 - 所以对于优秀的程序员,这应该是显而易见的:)为什么他不能达到实现类方法。
显示您的代码,请 – BooDoo
@BooDoo没有什么可显示的,但我添加了一些代码。 –
http://stackoverflow.com/q/23151117/6152781 – BooDoo