1

アプリケーションでいくつかのカスタム ActionModes を使用しています。アクション モードが閉じられると、関連するビューを閉じる、変更を更新するなどのハウスキーピングを行います。OnDestroyActionMode でアクション モードが閉じられたことを検出します。

私の問題は、一部の ActionModes 内で、ユーザーが別のシステム アクションモード (テキストのコピー/貼り付け/選択) をトリガーする可能性があることです。その場合、 onDestroyActionMode が呼び出され、「スタック」機能を実装するのではなく、ユーザーが最初のアクションモードで完了したと誤って想定しているため、この onDestroyActionMode を無視して、ユーザーにテキストを編集/カット/などさせてから、完了したら以前のアクションモード。

どうすればこれを達成できますか?

4

1 に答える 1

0

状況をさらに明らかにする: ハニカムの前に、TextView で longPress を実行すると、オプション (「単語を選択」、「すべてを選択」、「「単語」を辞書に追加」など) を含むポップアップ ウィンドウが表示されますが、既存の ActionMode には影響しません。表示されているときと閉じられているときの両方(押し戻すことによって)。したがって、これはハニカム以前の問題ではありません。

HTC Sense に関する詳細: Sense は TextView.setCustomSelectionActionModeCallback() を尊重しません。これは、Sense が Text 選択機能に ActionMode を使用しないためです (そして、他の世界がそうするかどうかは明らかに気にしません!)。そのため、この問題はその状況では別のにおいがします (Sense で次のソリューションをテストしていないため、どのように動作するかわかりません)。

解決策は、独自のカスタム ActionMode.Callback を作成して OS のものを置き換え、必要な TextView および/または EditText の setCustomSelectionActionModeCallback() に適用することです (ただし、デバイスがハニカム以上を実行している場合のみ)。カスタム onTextSelectionCABDestroyed コールバック インターフェイスをカスタム ActionMode.Callback に渡し、onDestroyActionMode メソッドで呼び出します。

最初にインターフェイスを作成し、元の ActionMode の再作成を処理する場所に実装します (または、Otto などでバス イベントを使用することもできます)。

public interface YourCallbackInterface {
    public void onTextSelectionCABDestroyed();
}

新しいクラスを作成します。

public final class CustomTextSelectionActionModeCallback implements ActionMode.Callback {
WeakReference<YourCallbackinterface> mYourCallbackinterface;
public CustomTextSelectionActionModeCallback(YourCallbackinterface yourCallbackInterface) {
    mYourCallbackinterface = new WeakReference<YourCallbackinterface>(yourCallbackInterface);
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
    return false;
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
    return true;    //returning true will create the ActionMode
}
@Override
public void onDestroyActionMode(ActionMode mode) {
    //this is the magic where we actually capture the destroy event for TextSelectionCAB and can subsequently do things like recreate the ActionMore that TextSelectionCAB greedily destroyed!
    mYourCallbackinterface.get().onTextSelectionCABDestroyed();
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
    return false;
}

}

また、ActionMode の onDestroyActionMode から ActionMode を再作成するときに StackOverflowException を回避することを忘れないでください。このように Runnable を Handler に postDelayed します

最後に、ActionBarSherlock を使用している場合は、CustomTextSelectionActionModeCallback が com.actionbarsherlock.view.ActionMode.Callback ではなく android.view.ActionMode.Callback を実装していることを確認してください。

注:私は ActionBarCompat で遊んだことがないので、これがどのように適用されるかわかりません。知っている人はコメントで投稿してください!

于 2013-10-01T20:51:47.200 に答える