回答核心问题:如何在背压后重新创建 ActionMode:
您可以将延迟的 Runnable 发布到 Handler 以重新创建 ActionMode。所需的延迟在设备之间可能会有所不同,我发现 200 毫秒可以处理我尝试过的所有内容。在 Activity 或 FragmentActivity 中尝试这些片段:
RepeatActionModeRunnable mRepeatActionModeRunnable;
Handler mHandler = new Handler();
@Override
protected void onPause() {
mHandler.removeCallbacks(mRepeatActionModeRunnable);
super.onPause();
}
private class RepeatActionModeRunnable implements Runnable {
ActionMode.Callback mRepeatActionMode;
public RepeatActionModeRunnable(ActionMode.Callback actionMode) {
mRepeatActionMode = actionMode;
}
@Override
public void run() {
mActionMode = startActionMode(mRepeatActionMode);
}
}
然后在 onDestroyActionMode 中,您可以在需要时使用它(即,您无疑需要一些逻辑包装它以检测是否应该或不应该重新创建它):
mHandler.removeCallbacks(mRepeatActionModeRunnable);
mRepeatActionModeRunnable = new RepeatActionModeRunnable(new SomeActionMode());
mHandler.postDelayed(mRepeatActionModeRunnable, 200);
至于 CAB 是否用于表单/数据输入,这种情况非常适合“行动呼吁”,这也是 ActionMode 模式存在的原因。障碍/细微差别/错误的存在,例如在按下后退按钮后重新创建以及用户选择要编辑的文本不应构成不能使用的理由,而应将其视为可能不是阻力最小的路径就解决方案而言(这是一个挑战!)。单独存在“完成并丢弃”模式也不应该构成在涉及数据输入的情况下不使用 ActionMode 的理由。这些都是可能更适合您的情况的可能性,而不是正确或错误的方式。
PS:关于如何处理TextSelectionCAB,这里有一个解决方案:Detect ActionMode nesting