1

我有几种情况,其中 DialogFragment 中的 GridView 需要上下文菜单。我的项目支持 API 8+,所以我使用的是 appcompat 支持库。到目前为止,我已经尝试在底层 ActionBarActivity 上调用Activity.startSupportActionMode(),但这实际上启动了对话框下方的 Contextual ActionBar/ActionMode 。我正在寻找一种使用 Activity 主题作为 dialog的常见但hacky(和高开销)方法的替代方法。

4

1 回答 1

2

查看框架和 appcompat 支持库的源代码,我们得到:

对于 API 11+ 标准框架:

Dialog dialog;
ActionMode.Callback actionMode;

Window window = dialog.getWindow();
View toplevel = window.getDecorView();
if (toplevel == null) { return; }

toplevel.startActionMode (actionMode);

对于 appcompat 支持库:

Window window = dialog.getWindow();
View toplevel = window.getDecorView();
if (toplevel == null) { return; }

android.view.ActionMode.Callback frameworkActionMode = 
    new CallbackWrapper (context, supportActionMode);
toplevel.startActionMode (frameworkActionMode);

请注意,如果您使用的是 DialogFragment,则需要对 getDialog() 的引用,这可能是 null,具体取决于您在 DialogFragment 生命周期中的位置。

从修订版 19.1.0(2014 年 3 月)开始,appcompat 支持库包括一个内部类 ( android.support.v7.internal.view.ActionModeWrapper.CallbackWrapper ),可用于在框架中包装支持库 ActionMode.Callback打回来。但是,如果您不想依赖内部类,您可以轻松滚动自己的包装器。

于 2014-05-30T00:39:22.360 回答