程序员人生 网站导航

android重写webview长按时选择文字然后点击搜索按钮的事件,默认是chrome接受点击事件,现在跳转到360搜索页面

栏目:综合技术时间:2015-05-28 08:40:08

用这个FindWebView替换默许使用的webview就能够了,重写SelectedText 类里地 show方法 string data就是获得到的选中的文字



import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.ActionMode;
import android.view.ActionMode.Callback;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.webkit.JavascriptInterface;
import android.webkit.WebSettings;
import android.webkit.WebView;



/**
 * 在webview的界面里面填加 长按界面时出现搜索按钮 点击搜索按钮跳转到搜索页面
 *
 * @author 王训龙 360404113
 *         <p/>
 *         2014⑻⑻ 上午11:39:16
 */
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class FindWebView extends WebView {
    public Callback callback;
    private OnScrollChangedListener mOnScrollChangedListener;




    @SuppressWarnings("deprecation")
    public FindWebView(Context context, AttributeSet attrs, int defStyle,
                       boolean privateBrowsing) {
        super(context, attrs, defStyle, privateBrowsing);
        init();
    }


    public FindWebView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }


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


    public FindWebView(Context context) {
        super(context);
        init();
    }


    @TargetApi(Build.VERSION_CODES.KITKAT)
    @SuppressLint("SetJavaScriptEnabled")
    private void init() {
        WebSettings setting = getSettings();
        setting.setJavaScriptEnabled(true);
        setting.setJavaScriptCanOpenWindowsAutomatically(true);
        addJavascriptInterface(new SelectedText(), "search");


        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Constants.DEBUG) {
            //支持webview调试
            WebView.setWebContentsDebuggingEnabled(true);
        }


    }


    @Override
    public ActionMode startActionMode(Callback callback) {
        CustomizedSelectActionModeCallback customizedSelectActionModeCallback = new CustomizedSelectActionModeCallback(
                callback);
        return super.startActionMode(customizedSelectActionModeCallback);
    }


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


    public class CustomizedSelectActionModeCallback implements ActionMode.Callback {
        private Callback callback;


        public CustomizedSelectActionModeCallback(Callback callback) {
            this.callback = callback;
        }


        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            return callback.onCreateActionMode(mode, menu);
        }


        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return callback.onPrepareActionMode(mode, menu);
        }


        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            if (item == null || TextUtils.isEmpty(item.getTitle())) {
                return callback.onActionItemClicked(mode, item);
            }
            if (!item.getTitle().toString().contains("搜索")
                    && !item.getTitle().toString().contains("search")) {
                return callback.onActionItemClicked(mode, item);
            }
            loadUrl("javascript:window.search.show(window.getSelection().toString());");
            clearFocus();
            return true;
        }


        @Override
        public void onDestroyActionMode(ActionMode mode) {
            callback.onDestroyActionMode(mode);
        }
    }


    public class SelectedText {
        @JavascriptInterface
        public void show(String data) {
            // TODO 这里获得选中的文字
            Intent intent = new Intent(getContext(), SearchActivity.class);
            intent.putExtra(SearchActivity.TAG_SEARCH, data);
            getContext().startActivity(intent);
        }
    }


    private int dY;


    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);


        int dy = t - oldt;
        dY += dy;
        if (mOnScrollChangedListener != null && Math.abs(dY) > 10) {
            dY = 0;
            mOnScrollChangedListener.onScroll(l, t, oldl, oldt);
        }
    }


    public interface OnScrollChangedListener {
        public void onScroll(int l, int t, int oldl, int oldt);
    }


    public void setOnScrollChangedListener(OnScrollChangedListener mOnScrollChangedListener) {
        this.mOnScrollChangedListener = mOnScrollChangedListener;
    }
}

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐