文本选择在自定义webview中不起作用



我想在我的CustomWebView中突出显示选定的文本,为此我实现了Actionmode如下......

  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);
        }
}

我从下面删除onTouchEvent后,它的工作,但onFling()上的webview失去,它只是水平滚动。

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));
      }

这个代码有什么问题吗?CAB是可见的并且正在工作,但是问题是没有选择文本。

请让我知道你真正的问题是什么:高亮选中的文本或页面翻转效果不能正常工作?

你的意思是,你正在使用其他库,如https://github.com/openaphid/android-flip,它不工作吗?

IMHO,单独使用你自己的手势检测器并返回super onTouch事件怎么样?
onTouchEvent返回true意味着你想要消费事件,并防止传播到父节点。

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

看到细节:http://developer.android.com/reference/android/view/View.OnTouchListener.html

"返回如果监听器已经使用了事件,则返回True,否则返回false。"

最新更新