我正在使用以下方法将ContextMenu
添加到我已构建的自定义视图中,但是我想知道如何响应该上下文菜单。
这不是活动,所以我不能这样做:
@override
public boolean onOptionsItemSelected(MenuItem item) {
private View.OnCreateContextMenuListener vC = new View.OnCreateContextMenuListener() {
@Override
public void onCreateContextMenu(ContextMenu arg0, View arg1,
ContextMenuInfo arg2) {
// TODO Auto-generated method stub
arg0.add(0, 0, 0, "Call");
arg0.add(0, 1, 0, "Map");
arg0.add(0, 2, 0, "Market");
}
};
更新:
这是我班上的非常简化的版本。
public final class NewView extends View {
public NewView(Context context, AttributeSet attrs) {
super(context, attrs);
cntxt = context;
this.setLongClickable(true);
this.setOnLongClickListener(vLong);
this.setOnCreateContextMenuListener(vC);
}
private View.OnLongClickListener vLong = new View.OnLongClickListener() {
public boolean onLongClick(View view) {
showContextMenu();
return true;
}
};
private View.OnCreateContextMenuListener vC = new View.OnCreateContextMenuListener() {
@Override
public void onCreateContextMenu(ContextMenu arg0, View arg1,
ContextMenuInfo arg2) {
// TODO Auto-generated method stub
arg0.add(0, 0, 0, "Call");
arg0.add(0, 1, 0, "Map");
arg0.add(0, 2, 0, "Market");
}
};
}
使用item.getItemId()
并根据switch
返回的数字创建cases
和getItemId()
这样的事情。
@override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId())
{
case 1:
Log.i("FIRST ITEM: ", "CALL");
break;
case 2:
Log.i("2nd ITEM: ", "MAP");
break;
case 3:
Log.i("3rd ITEM: ", "Market");
break;
default:
}
}
我希望这就是对菜单项选择做出反应的意思。 :)
[似乎没有人完全回答TS的问题(最终是我的),因此让我发布对此的解决方案。给定上面的代码,您可以附加自定义MenuItem的点击处理程序:
private View.OnCreateContextMenuListener vC = new View.OnCreateContextMenuListener() {
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
menu.add(0, 0, 0, "Call")
.setOnMenuItemClickListener(mMenuItemClickListener);
menu.add(0, 1, 0, "Map")
.setOnMenuItemClickListener(mMenuItemClickListener);
menu.add(0, 2, 0, "Market")
.setOnMenuItemClickListener(mMenuItemClickListener);
}
};
private OnMenuItemClickListener mMenuItemClickListener = new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case 0:
// do "Call"
return true;
case 1:
// do "Map"
return true;
case 2:
// do "Market"
return true;
}
return false;
}
};
};
这在Android中似乎是一个奇怪的不一致之处-一个View可以创建一个上下文菜单,但是对所述菜单的处理只能在完全不同的代码中进行?
我也在用setOnMenuItemClickListener()解决这个问题。该文档表明这是合理的,但是如果您使用的是MenuInflater,则需要进行设置。
public void onCreateContextMenu(final ContextMenu menu, final View v,
final ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
final MenuInflater menuInflater = this.menuInflater;
menuInflater.inflate(R.menu.context_date, menu);
final int length = menu.size();
for (int index = 0; index < length; index++) {
final MenuItem menuItem = menu.getItem(index);
menuItem.setOnMenuItemClickListener(this);
}
}
在视图中:让您的视图实现ContextMenuInfo
public class MyView extends View implements ContextMenuInfo
然后,重写getContextMenuInfo以返回您的视图。
@Override
protected ContextMenuInfo getContextMenuInfo() {
return this ;
}
在您的活动中:为ContextMenu注册视图。
registerForContextMenu(myView);
然后在您的活动onContextItemSelected中访问视图。
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
...
case R.id.action_ctx_wordview_read_tts:
MyView myView = (MyView) item.getMenuInfo();
...
}
}
注意:当我向MyView添加onClickListener时,contextMenu停止工作。我必须添加以下代码来解决问题。
tvWord.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return false;
}
});
我做的也一样,但是上下文菜单只闪烁了e一段时间,然后消失了。所以我无法选择任何选项。您有解决方案吗?
您可以在为主布局(在onCreate中)充气后,从活动中为View
分配一个变量。
myView = (View) findViewById(R.id.my_view);
下一步,执行registerForContextMenu(myView);
最后,您可以覆盖onCreateContextMenu
,您可以在其中添加上下文菜单出现时的操作。