4

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.

        }
    }
}
4

1 に答える 1