1

この状況を見てみましょう: 画面に DONE & DISCARD オプションを指定して CAB を開き、フォームに入力する必要があり、フィールドのエラー値を受け入れません。したがって、ユーザーは有効な値を入力するか ([戻る]/[完了] を押して受け入れる)、または CAB で [破棄] を押す必要があります。

DONE を押すとonDestroyActionMode()すぐに開始され、その後 CAB が閉じられます。したがって、これはonBackPressed()有効性のチェックが開始される場所 ( の横) です。

問題は、そこに新しい ActionMode を作成すると (フォームの有効性チェックが失敗した場合)、再帰ループが開始されることです (新しい CAB が最初に古いものを閉じ始めるなど) --> StackOverflowError.

私は StackOverflowError を防ぐために状態変数を作成しようとしましたが、その場合、それは毎秒のみ (そしてのみonBackPressed()) :-/

それで、質問:CABが呼び出された直後にCABを開いたままにする方法(または新しいCABを再度開く方法)onDestroyActionMode()は?

4

3 に答える 3

4

最初のコメント者は確かに正しいです。アクション モードは一時的なものであり、ユーザーがいつでも終了できるように設計されています。それらは、完全なセットに対してアクションを実行する前に、追加または削除できるバッチ選択のようなものを表すためのものです。メールトリアージとテキスト編集が 2 つの例です。ダイアログをキャンセルするのと同じように、アクション モードの終了は非破壊的であるべきです。これは確認ステップとして扱われるべきではありません。

テキスト編集といえば、ここに含まれるフォームにテキスト フィールドが含まれていることを強く暗示しています。ユーザーがテキストを強調表示し、TextView が独自の編集アクション モードを開始するとどうなりますか? アクション モードを開始すると、現在のアクション モードが暗黙的に終了します。

進行中の編集を表現するには、別のアフォーダンスを使用する必要があります。

于 2013-09-02T23:24:24.810 に答える
0

中心的な質問への回答: バック プレスの後に 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 のネスティングを検出する

于 2013-10-01T16:07:01.627 に答える