web-dev-qa-db-ja.com

ActionModeで[完了]ボタンがクリックされたかどうかを認識する方法

グリッドでアイテムを選択するために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ではネイティブアクションバーが使用されるためです。

36
Tanya

これは実装固有であり、非常に非標準であるため、行わないでください。

アクションモードが終了したときにonDestroyActionModeコールバックを使用できます。

36
Jake Wharton

これが解決策です:

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();
    }
});
21
Alexiosdev

ここに私の実装がありますが、それは適切なハックですが、動作し、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と互換性があるかどうか知りたいです。

10
Eurig Jones