【问题标题】:How to add a Contextual Action Bar to a Dialog如何将上下文操作栏添加到对话框
【发布时间】:2014-05-30 00:39:22
【问题描述】:

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

【问题讨论】:

  • 我认为是因为您实际上没有提出问题或包含任何可能遇到问题的示例代码。虽然,我真的不认为 1 次投票值得一提。
  • 我以前从未一次性完成问答,所以我将问题设置为基本上是对以下答案的介绍。但我想我可以在里面放一张图……
  • 您应该将问题改写为实际上是一个问题。您可以从不知道答案的人的角度提出一个关于如何执行您在答案中解释的问题的一般性问题。每个人都应该能够独立 - 问题提出,答案给出解决方案。如果它有助于尝试考虑人们可能如何搜索以尝试找到您的问题/答案并在问题中包含许多这些术语(使用正确的语言,而不仅仅是标签转储)。

标签: android dialog android-support-library contextual-action-bar


【解决方案1】:

查看框架和 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() 的引用 which may be null,具体取决于您在 DialogFragment 生命周期中所处的位置。

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

【讨论】:

  • 谢谢。上面的选项也适用于更新的 API 级别。较低的(对于appcompat)无法工作,只需检查类型冲突即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 2016-05-28
  • 1970-01-01
相关资源
最近更新 更多