1

I'm trying to show custom buttons for text selection in React-Native WebView on Android. I've created a custom component as described here. It works fine. Following this answer, I'm trying to override ActionMode with custom ActionMode.Callback to display my custom menu. However it doesn't seem to work at all. My code: CustomWebViewManager.java

protected static class CustomWebView extends RNCWebView {

    public Context context;

    public CustomWebView(ThemedReactContext reactContext) {
        super(reactContext);
        this.context=context;
    }

    // setting custom action bar
    private ActionMode mActionMode;
    private ActionMode.Callback mSelectActionModeCallback;
    private GestureDetector mDetector;

    // this will over ride the default action bar on long press
    @Override
    public ActionMode startActionMode(Callback callback) {
        ViewParent parent = getParent();
        if (parent == null) {
            return null;
        }
            String name = callback.getClass().toString();
            if (name.contains("SelectActionModeCallback")) {
                mSelectActionModeCallback = callback;
                mDetector = new GestureDetector(context,
                    new CustomGestureListener());
            }
        CustomActionModeCallback mActionModeCallback = new CustomActionModeCallback();
        return parent.startActionModeForChild(this, mActionModeCallback);
    }

    private class CustomActionModeCallback implements ActionMode.Callback {

        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            mActionMode = mode;
            MenuInflater inflater = mode.getMenuInflater();
            inflater.inflate(R.menu.menu, menu);
            return true;
        }
     //overriding onPrepareActionMode, onActionItemClicked and onDestroyActionMode as usual
       ...
    }

private class CustomGestureListener extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            if (mActionMode != null) {
                mActionMode.finish();
                return true;
            }
            return false;
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if(mDetector !=null)
            mDetector.onTouchEvent(event);
        return super.onTouchEvent(event);
    }


}

What I'm doing wrong here? Is that a correct approach? Thanks.

0 Answers0