ActionMode.Callback
でテキストを選択するためのカスタム コンテキスト アクション バーを表示するために、カスタムを作成しましたWebView
。Android 4.4 では問題なく動作しますが、4.1 ~ 4.3 では選択ハンドルが表示されません。強調表示されている 1 つの単語に対してカスタム操作を実行することはできますが、ハンドルがないために選択を変更することはできません。
また、ActionMode
が破壊された場合、選択は画面からクリアされません。対照的に、ユーザーが他の場所をタップして選択をクリアしても、ActionMode
は破棄されません。
clearFocus()
選択を削除しようとするために呼び出すべきメソッドであるかどうかさえわかりません。その行にコメントしましたが、4.4 の動作は変わりませんでした。それでも問題なく動作しました。
これらの問題を解決するにはどうすればよいですか?
これは私の現在の実装です:
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;
case R.id.button_2:
// do stuff
break;
... // cases for other buttons
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 4.3 (and probably anything older).
clearFocus(); // Remove the selection highlight and handles.
}
}
}