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
,并设法找到解决方案(对我有用):
创建了一个字段,
private AppCompatDelegate delegate;
像这样覆盖 onStart
:
@Override
public void onStart () {
super.onStart();
Dialog dialog = getDialog();
if (dialog != null) delegate = AppCompatDelegate.create(dialog, this);
}
并创建了一个动作模式启动器方法
@Nullable
public ActionMode startSupportActionMode (ActionMode.Callback callback) {
if (delegate != null) return delegate.startSupportActionMode(callback);
return null;
}
它也可以覆盖 onCreateDialog
并在那里创建委托,但是从 DialogFragment
的来源来看,getDialog
方法应该 return 相同(当前) onStart
上的对话框实例也是如此,因此可以在那里创建委托。
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
,并设法找到解决方案(对我有用):
创建了一个字段,
private AppCompatDelegate delegate;
像这样覆盖
onStart
:@Override public void onStart () { super.onStart(); Dialog dialog = getDialog(); if (dialog != null) delegate = AppCompatDelegate.create(dialog, this); }
并创建了一个动作模式启动器方法
@Nullable public ActionMode startSupportActionMode (ActionMode.Callback callback) { if (delegate != null) return delegate.startSupportActionMode(callback); return null; }
它也可以覆盖 onCreateDialog
并在那里创建委托,但是从 DialogFragment
的来源来看,getDialog
方法应该 return 相同(当前) onStart
上的对话框实例也是如此,因此可以在那里创建委托。