如何使上下文动作模式栏覆盖appcompat-v7工具栏,但不是导航抽屉?

我有一个应用程序栏和导航抽屉的活动。 应用程序栏使用来自appcompat-v7库版本21+的新工具栏类实现,导航抽屉显示在其前面。

该活动包含一个列表视图,其中可以select项目,所以我正在显示一个上下文操作栏(CAB)。 它是通过调用:

ActionBarActivity.startSupportActionMode(android.support.v7.view.ActionMode.Callback callback) 

默认情况下,CAB插入在工具栏上方而不是覆盖它; 看来CAB默认只覆盖真正的ActionBar。 正如在这个答案中所示 ,当这个主题属性被设置时,CAB正确地覆盖工具栏:

 <item name="windowActionModeOverlay">true</item> 

但是,这也使得CAB覆盖导航抽屉,根据材料devise规范 ,这是不正确的。 主要的Androiddevise文档仍然build议在导航抽屉打开时隐藏CAB并在closures时再次显示, 这可以用来“解决”问题,但不应该是必需的。 在材料devise规范中,没有指定当导航抽屉打开时CAB应该隐藏,而且由于导航抽屉应该打开CAB,隐藏CAB实际上是视觉上的分心。

有什么方法可以在CAB前面显示抽屉式导航栏,同时还能覆盖工具栏?

Solutions Collecting From Web of "如何使上下文动作模式栏覆盖appcompat-v7工具栏,但不是导航抽屉?"

我可能find了一个解决scheme – 或者一个简单的解决方法。
我使用startActionMode()代替内置的setChoiceMode()时,即使有一个ListFragment也有同样的问题。 所以我看着ListFragment代码,我发现startActionMode()不是在activity上调用,而是在它的ListView上调用,所以我尝试了使用视图。 在我的代码现在它显然工作如期使用片段ListView:

 ActionMode mActionMode = getListView().startActionMode(this); 

或使用包含我的片段的活动容器:

 View aView = getActivity().findViewById(R.id.container); ActionMode mActionMode = aView.startActionMode(this); 

也:

  • 现在后退button会破坏动作模式,而之前没有
  • CAB现在正确地覆盖了Action Bar,而在我的风格中使用windowActionModeOverlay只覆盖了它的一部分 – 至less在我的情况下
  • CAB图标是一个后退箭头,而不是一个勾号 – 不知道这是什么意思

说实话,我不知道这背后的原因,所以我不知道这个解决scheme有多安全,但暂时似乎工作正常。
如果有人有更好的理解,请随时评论或编辑。