Внедрил съм 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.)
Как може да се поправи това?