Android CAB - 我可以在 DialogFragment 中启动支持操作模式吗

Android CAB - can I start Support Action Mode in a DialogFragment

CAB 在 AppCompatActivity 中运行良好。

我也可以在 DialogFragment (v4) 中使用它吗?如果是这样,我应该使用什么作为启动动作模式的上下文?下一条语句不起作用:

((AppCompatActivity) MainActivity.myActivity).startSupportActionMode( mcListener);

我知道代码已经在对话框中了。

找到了适用于所有 API 级别的答案:

Dialog dialog;
ActionMode.Callback actionMode;

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

toplevel.startActionMode (actionMode);

灵感来自 MandisaW 创建的答案。

在当前 activity 上启动操作模式会显示对话框后面的操作栏,因此如果不关闭它就无法访问它。
经过多次尝试避免这种情况,我有一个查看 source code of AppCompatActivity,并设法找到解决方案(对我有用):

  1. 创建了一个字段,

    private AppCompatDelegate delegate;
    
  2. 像这样覆盖 onStart

    @Override
    public void onStart () {
      super.onStart();
    
      Dialog dialog = getDialog();
      if (dialog != null) delegate = AppCompatDelegate.create(dialog, this);
    }
    
  3. 并创建了一个动作模式启动器方法

    @Nullable
    public ActionMode startSupportActionMode (ActionMode.Callback callback) {
      if (delegate != null) return delegate.startSupportActionMode(callback);
      return null;
    }
    

它也可以覆盖 onCreateDialog 并在那里创建委托,但是从 DialogFragment 的来源来看,getDialog 方法应该 return 相同(当前) onStart 上的对话框实例也是如此,因此可以在那里创建委托。