Подтвердить что ты не робот

Как узнать, нажата ли кнопка "Готово" в ActionMode

Я использую ActionMode для выбора элементов в сетке. Проблема в том, что я не могу узнать, нажата ли кнопка Готово. Я могу только знать, что ActionMode закончен. Но нажатие Назад завершает ActionMode тоже. Желаемое поведение - принять выбор на Готово клик и выйти ActionMode в Назад нажмите.

Я попытался использовать ActionMode.setCustomView(), но это не влияет на кнопку Готово. Activity.onBackPressed() не вызывается при запуске ActionMode.

Единственное решение, которое я нашел, - это использовать ActionBarSherlock и вручную Готово:

View closeButton = findViewById(R.id.abs__action_mode_close_button); 

Но он работает только на Android 2.x-3.x, потому что на 4.x используется панель действий.

4b9b3361

Ответ 1

Пожалуйста, не делайте этого, поскольку он специфичен для реализации и крайне нестандартен.

Вы можете использовать обратный вызов onDestroyActionMode, если отключен режим действия.

Ответ 2

Вот решение:

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 calling mMode.finish();
    }
});

Ответ 3

Вот моя реализация, и это правильный взлом, но он работает, и я не могу найти альтернативу тому, чтобы делать что-то конкретное при щелчке 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 с моим текущим проектом.