Invalid text doesn't work in custom webview

I want to highlight the selected text in mine CustomWebView

because I implemented Actionmode

like this:

  public class CustomWebView extends WebView {


public ActionMode mActionMode;
public ActionMode.Callback mActionModeCallback;

private ActionMode.Callback mSelectActionModeCallback;


public CustomWebView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public CustomWebView(Context context) {
    super(context);

    this.context = context;
    sm = new ScreenManager((Activity) context);
}   



@Override
public ActionMode startActionMode(Callback callback) {

    ViewParent parent = getParent();
    if (parent == null) {
        return null;
    }
    String name = "";
    if (callback != null)
        name = callback.getClass().toString();
    if (name.contains("SelectActionModeCallback")) {
        mSelectActionModeCallback = callback;
    }
    System.out.println("startActionMode"+name);
    mActionModeCallback = new CustomActionModeCallback();

    return super.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.reader_epub_menu, menu);
        return true;
    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false; // Return false if nothing is done
    }


    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        switch (item.getItemId()) {
        case R.id.action_highlight_add:
            loadUrl(highlightSelection());
            break;
        case R.id.action_note_add:
            frag.call(spineIndex, tocIndex);
            break;
        }

        mActionMode.finish(); 
        return true;
    }


    @Override
    public void onDestroyActionMode(ActionMode mode) {

        frag.makeSwipeEnable();
        clearFocus(); // Remove the selection highlight and handles.


        if (mSelectActionModeCallback != null) {
            mSelectActionModeCallback.onDestroyActionMode(mode);
        }

        mActionMode = null;
    }
}



public ActionMode getActionMode() {
    return mActionMode;
}

and my in my reader fragment implemented Gesture listner as follows 


public class GestureListener extends
            GestureDetector.SimpleOnGestureListener {

 @Override
        public void onLongPress(MotionEvent e) {
            makeSwipeDisable();
            reader.startActionMode(reader.mActionModeCallback);
            reader.dispatchTouchEvent(e);
            super.onLongPress(e);
        }
}

      

After I removed the onTouchEvent from the following it worked, but onFling()

on webview it loses, it just scrolls horizontally.

reader = new CustomWebView(getActivity()) {

        @Override
        protected void onScrollChanged(int l, int t, int oldl, int oldt) {
            // TODO Auto-generated method stub
            super.onScrollChanged(l, t, oldl, oldt);
            // checking whether the current page has been bookmarked and
            // animates the ribbon down and up
            if (isBookmarked(rOffset, currentContent))
                scaleDown();
            else
                scaleUp();
        }


        @Override
       public boolean onTouchEvent(MotionEvent event) {
            return (gestureDetector.onTouchEvent(event) || super
                   .onTouchEvent(event));
      }

      

Is there something wrong with this code? The CAB is visible and working, but the problem is not selected.

+3


source to share


1 answer


Please let me know what your real question is: highlight selected text or is the page flip effect not working as expected?

Did you mean you are using a different library like https://github.com/openaphid/android-flip and it doesn't work?

IMHO how about using your own gesture detector and returning a super onTouch event?
Returning true for onTouchEvent means you want to consume the event and prevent the parent from propagating.



 @Override
       public boolean onTouchEvent(MotionEvent event) {
            gestureDetector.onTouchEvent(event);
            return super.onTouchEvent(event);
      }

      

See details: http://developer.android.com/reference/android/view/View.OnTouchListener.html

" Returns True if the listener is consuming the event; otherwise, false."

+2


source







All Articles