我正在使用以下方法将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");
}
};
}
答案 0 :(得分:3)
似乎没有人能够详尽地回答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;
}
};
};
答案 1 :(得分:2)
使用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:
}
}
我希望这是你对菜单项选择作出反应的意思。 :)
答案 2 :(得分:1)
这似乎是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);
}
}
答案 3 :(得分:0)
在视图中:
让您的视图实现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();
...
}
}
注意:
当我将onClickListener添加到MyView时,contextMenu停止工作。我必须添加以下代码来解决问题。
tvWord.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return false;
}
});
答案 4 :(得分:-1)
在给主要布局充气后(在'onCreate中),你可以从活动中为你的View
指定一个变量。
myView = (View) findViewById(R.id.my_view);
接下来,执行registerForContextMenu(myView);
最后,您可以覆盖onCreateContextMenu
,您可以在其中添加上下文菜单出现时发生的情况。