グリッドでアイテムを選択するためにActionMode
を使用します。問題は、完了ボタンがクリックされたかどうかを正確に認識できないことです。私ができる唯一のことは、ActionMode
が終了したことを知ることです。しかしBackを押すとActionMode
も終了します。 完了クリックで選択を受け入れ、_戻るプレスでActionMode
を終了するのが望ましい動作です。
ActionMode.setCustomView()
を使用しようとしましたが、完了ボタンには影響しません。 Activity.onBackPressed()
は、ActionModeの開始時に呼び出されません。
私が見つけた1つの解決策は、ActionBarSherlockを使用して、手動でDoneボタンを取得することです。
View closeButton = findViewById(R.id.abs__action_mode_close_button);
ただし、Android 2.x-3.xのみで機能します。4.xではネイティブアクションバーが使用されるためです。
これは実装固有であり、非常に非標準であるため、行わないでください。
アクションモードが終了したときにonDestroyActionMode
コールバックを使用できます。
これが解決策です:
ActionMode mMode = MyActivityClass.this.startActionMode(some implementation);
int doneButtonId = Resources.getSystem().getIdentifier("action_mode_close_button", "id", "Android");
View doneButton = MyActivityClass.this.findViewById(doneButtonId);
doneButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// do whatever you want
// in Android source code it's calling mMode.finish();
}
});
ここに私の実装がありますが、それは適切なハックですが、動作し、ActionMode DONEがクリックされたときに特定のことを実行する代替手段を実際に見つけることができません。このイベントをもっとエレガントにキャプチャできないのは本当に奇妙だと思います。
これを少し見苦しくしないようにするための提案は大歓迎です...
私の活動で….
boolean mActionModeIsActive = false;
boolean mBackWasPressedInActionMode = false;
@Override
public boolean dispatchKeyEvent(KeyEvent event)
{
mBackWasPressedInActionMode = mActionModeIsActive && event.getKeyCode() == KeyEvent.KEYCODE_BACK;
return super.dispatchKeyEvent(event);
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu)
{
mActionModeIsActive = true;
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode)
{
mActionModeIsActive = false;
if (!mBackWasPressedInActionMode)
onActionModeDoneClick();
mBackWasPressedInActionMode = false;
}
public void onActionModeDoneClick();
{
// Do something here.
}
アクティビティでフラグメントを使用している場合、このコードの一部はおそらくフラグメントにあり、その他のビットはアクティビティにある必要があります。
@JakeWharton(および他のActionBarSherlockユーザー)が旅行でこれを目にした場合。現在のプロジェクトにABSを統合する必要があるので、上記がABSと互換性があるかどうか知りたいです。