Я реализовал ActionMode.Callback
для пользовательских функций выбора текста в файле WebView
. Проблема, с которой я сталкиваюсь, заключается в том, что состояния выбора и режима действия не совпадают.
Когда я долго нажимаю, все начинается просто отлично.
Когда я взаимодействую с одной из кнопок или WebView
(исключая фактический выбор), тогда ActionMode
должен быть уничтожен, а выбор должен исчезнуть.
В Android 4.4 KitKat именно так и происходит.
Однако это не то, что происходит в 4.1.1 - 4.3, Jelly Bean. Когда я нажимаю одну из кнопок, выделение не удаляется.
Когда я нажимаю за пределами выделения, происходит прямо противоположное. Выбор удаляется, но контекстная панель действий остается на экране.
Вот код моего
CustomWebView
public class CustomWebView extends WebView {
private ActionMode.Callback mActionModeCallback;
@Override
public ActionMode startActionMode(Callback callback) {
ViewParent parent = getParent();
if (parent == null) {
return null;
}
mActionModeCallback = new CustomActionModeCallback();
return parent.startActionModeForChild(this, mActionModeCallback);
}
private class CustomActionModeCallback implements ActionMode.Callback {
// Called when the action mode is created; startActionMode() was called
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
// Inflate a menu resource providing context menu items
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.contextual_menu, menu);
return true;
}
// Called each time the action mode is shown.
// Always called after onCreateActionMode, but
// may be called multiple times if the mode is invalidated.
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
// This method is called when the handlebars are moved.
loadJavascript("javascript:getSelectedTextInfo()");
return false; // Return false if nothing is done
}
// Called when the user selects a contextual menu item
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch(item.getItemId() {
case R.id.button_1:
// do stuff
break;
...
default:
break;
}
mode.finish(); // Action picked, so close the CAB
return true;
}
// Called when the user exits the action mode
@Override
public void onDestroyActionMode(ActionMode mode) {
// TODO This does not work in Jelly Bean (API 16 - 18; 4.1.1 - 4.3).
clearFocus(); // Remove the selection highlight and handles.
}
}
}
Как видно из комментария выше, я считаю, что проблема связана с методом clearFocus()
. Когда я удаляю этот метод, нажатие кнопки оставляет выделение позади в 4.4, точно так же, как поведение в Jelly Bean. clearFocus()
дает ожидаемое поведение в 4.4, но не переносится на более ранние API. (Обратите внимание, что clearFocus()
не является новым для KitKat; он был в Android со времен API 1.)
Как это можно исправить?