我想在用户触摸按钮时打开“上下文菜单”。
我搜索没有成功获得没有自动对焦的默认Android上下文菜单的解决方案。对我来说,默认的自动对焦是一个痛苦的问题,因为它强制用户(在菜单窗口之外)额外点击以选择主窗口上的另一个项目。
我的活动提供了一个包含 g1 , g2 ,...的网格视图,并且上下文菜单会显示textareas t1 列表, t2 ......这就是我需要的:
希望这是有道理的,如果没有,请告诉我。
我想破解默认的上下文菜单以这种方式自定义会有太多麻烦吗?创建我自己的完全没问题。但我不知道从哪里开始。 那么你能指出我实现我想要的方向吗?
感谢您的时间
答案 0 :(得分:0)
有两个建议如何使用自定义上下文菜单。
变体A:也许您可以选择将当前布局包装到RelativeLayout
中,然后添加LinearLayout
(包含您自定义的上下文菜单)用户点击g1后立即RelativeLayout
。单击g2后,删除旧版LinearLayout
并添加一个relativeLayout.addView(contextMenuLayout)
的新版本。要将LinearLayout置于底部,请务必在其上使用contextMenuLayout.setLayoutParams(...)
并传递RelativeLayout.LayoutParams
的实例,并设置“对齐父级底部”和“居中水平”。由于您的contextMenuLayout
是RelativeLayout
的最后一个元素,因此会将其绘制在最顶层。焦点将按您的意愿行事。
变体B :将当前版面包裹为垂直方向的LinearLayout
。第一个单元格包含您当前的布局。第二个单元格可能包含您自定义的上下文菜单,您可以像在变体A中一样添加和删除。两个优点:首先,您的原始布局不会被上下文视图覆盖,并且这样一切都始终可见。其次,您可以将'LinearLayout'设置为“animateLayoutChanges”,这使得上下文菜单可以使用Android API11 +顺利淡入(在早期版本中被忽略)。
变体A和B作为伪代码(两者都相似):
class YourActivity extends Activity implements OnItemClickListener {
View contextMenu = null;
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// this could be RelativeLayout (Variant A) or LinearLayout (Variant B) which in turn contains your Layout
Layout rootLayout = (Layout)findViewById(R.id.root_layout);
// in case there is a context menu open, remove it
if(contextMenu!=null)
rootLayout.removeView(contextMenu);
// add new self-defined context menu
contextMenu = getContextMenuView();
rootLayout.addView(contextMenu);
}
private View getContextMenuView() {
Layout contextMenuView = new LinearLayout(...);
.... add contents ...
return contextMenuView;
}
....
}
请注意,您需要将rootLayout强制转换为LinearLayout
或RelativeLayout
,因为Layout
本身没有addView(...)
方法。