状況をさらに明らかにする: ハニカムの前に、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 で遊んだことがないので、これがどのように適用されるかわかりません。知っている人はコメントで投稿してください!