中心的な質問への回答: バック プレスの後に ActionMode をどのように再作成できますか:
Runnable を Handler に postDelayed して、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 パターンの理由でもあります。戻るボタンを押した後の再作成や、ユーザーが編集するテキストを選択した場合などのハードル/ニュアンス/バグの存在は、使用しても問題ないという根拠にはなりません。ソリューションの観点から(それは挑戦です!)。'Done & Discard' パターンの存在だけでも、データ入力を伴う状況で ActionMode を使用しない理由にはなりません。これらはすべて、正しい方法または間違った方法ではなく、状況に適している可能性があります。
PS: TextSelectionCAB の処理方法については、ここに解決策があります: ActionMode のネスティングを検出する