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