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

该博客介绍了一个自定义的FindWebView类,用于替换Android中的默认WebView。当用户在网页上长按时,会显示一个包含搜索选项的菜单。点击搜索按钮,FindWebView将获取选中的文字并启动一个新的搜索活动,跳转到360搜索页面。博客中提供了详细的代码实现,包括设置JavaScript交互、自定义ActionMode回调和处理搜索事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用这个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-8-8 上午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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值