Android按钮点击后打开上下文菜单

21

我想在点击按钮时打开上下文菜单,但是我也需要知道当我点击按钮时哪个列表项获得了焦点。你知道如何做到这一点吗?onclick方法中应该放什么代码?

4个回答

58

我也在寻找同样的内容,后来发现应该使用对话框(Dialogs)而不是上下文菜单(context menu)

final CharSequence[] items = {"Red", "Green", "Blue"};

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Pick a color");
builder.setItems(items, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int item) {
        Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
    }
});
AlertDialog alert = builder.create();
alert.show();

http://developer.android.com/guide/topics/ui/dialogs.html#AlertDialog


1
我一直在尝试使用上下文菜单,认为这是唯一的解决方案...谢谢。这种方法更加简单、清晰,并且与上下文菜单模式在视觉上非常相似。 - alexgophermix

26
如果出于某种原因你真的想这样做...(在我这种情况下,是因为懒惰)
在你的活动的onCreate或者用户点击按钮之前的某个地方,对该按钮调用 registerForContextMenu。然后在实际的按钮 onClick 处理程序中,调用 openContextMenu(View)
例如,我在xml中声明了一个按钮。
<Button
    android:id="@+id/btn_help"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="onHelp"
    android:text="@string/help_btn_text" />

在我的 onCreate 方法中

registerForContextMenu(findViewById(R.id.btn_help));

并且在 onHelp 函数中

public void onHelp(View v) {
    openContextMenu(v);
}

这能够正常工作是因为视图v与注册了上下文菜单的视图是相同的。


4

首先,您应该通过调用registerForContextMenu(View view)来注册视图。其次,覆盖onCreateContextMenu()以添加菜单,最后,覆盖onContextItemSelected()以在每个菜单上放置逻辑。


在上下文菜单的情况下: this.registerForContextMenu(getListView().getFocusedChild()); this.openContextMenu(getListView().getFocusedChild()); 返回true; 这对我不起作用。有什么想法吗? - Mustafa İrer

1
首先,你应该知道为什么要使用ContextMenu。一个视图的ContextMenu功能类似于PC上的右键菜单,这意味着对某个项目的“可用操作”。
根据你的描述,我认为你实际需要的是一个带有列表的自定义对话框,当点击按钮时显示,并且能够获取你的ListView中的焦点项。然后,你可以保存ContextMenu的注册信息,以供真正需要菜单的视图使用 :)

实际上,在我的文件管理器应用程序中,没有场景可以让用户处理长按操作。所以我正在尝试在选项菜单中创建一个按钮来处理上下文菜单。在我的代码中,我重写了onCreateContextMenu()和onContextItemSelected()方法。在我的onOptionsItemSelected方法中,我尝试调用上下文菜单。我尝试了以下代码: case context_menu: this.registerForContextMenu(getListView().getFocusedChild()); this.openContextMenu(getListView().getFocusedChild()); return true; 但这对我不起作用。有什么想法吗? - Mustafa İrer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接