首页 > 系统 > Android > 正文

Android6.0的坑之webview的showFindDialog

2019-11-08 00:28:23
字体:
来源:转载
供稿:网友

Android的webview有个系统弹窗的功能是,可以出现搜索匹配网页内字符串关键字的功能。其实就是这个方法:

    /**     * Starts an ActionMode for finding text in this WebView.  Only works if this     * WebView is attached to the view system.     *     * @param text if non-null, will be the initial text to search for.     *             Otherwise, the last String searched for in this WebView will     *             be used to start.     * @param showIme if true, show the IME, assuming the user will begin typing.     *                If false and text is non-null, perform a find all.     * @return true if the find dialog is shown, false otherwise     * @dePRecated This method does not work reliably on all Android versions;     *             implementing a custom find dialog using WebView.findAllAsync()     *             provides a more robust solution.     */    @Deprecated    public boolean showFindDialog(String text, boolean showIme) {        checkThread();        return mProvider.showFindDialog(text, showIme);    }

具体调用是webview. showFindDialog(null,true);默认弹出软键盘。但是有个bug就是如果是焦点模式,去使用这个弹窗的话,就不能按ok键触发弹出软键盘,只能搜索系统中出现的下一个字符串,造成我们这种智能电视项目只能用遥控器操作,就出现了问题,功能感觉不能正常使用。所以,当然就是找到showFindDialog的具体实现在哪里,然后确认editText的有  

        mEditText.setFocusable(true);        mEditText.setFocusableInTouchMode(true);        mEditText.requestFocus();        mEditText.requestFocusFromTouch();

这几个属性。但是不论怎么全局搜索,都没有找到函数的实现体。后来绝望之下,查百度,发现大家都是在Android4.0左右的版本找到这个函数的实现,Android5.0以上就没有具体实现了,怎么办,问题是要解决啊,于是我灵机一动,想着android4.0上不是有实现体吗,看看里面具体是啥操作,一看里面也没有具体到editText这个控件。

WebViewChromium.java (frameworks/webview/chromium/java/com/android/webview/chromium) 68563 2016/12/13

有函数的具体实现

    @Override    public boolean showFindDialog(final String text, final boolean showIme) {        mFactory.startYourEngines(false);        if (checkNeedsPost()) {            return false;        }        if (mWebView.getParent() == null) {            return false;        }        FindActionModeCallback findAction = new FindActionModeCallback(mWebView.getContext());        if (findAction == null) {            return false;        }        mWebView.startActionMode(findAction);        findAction.setWebView(mWebView);        if (showIme) {            findAction.showSoftInput();        }        if (text != null) {            findAction.setText(text);            findAction.findAll();        }        return true;    }

继续跟踪到FindActionModeCallback中,终于找到了edittext。好吧,死马当活马医,在Android6.0上竟然找到了这个FindActionModeCallback.java

按照原本思路加控件聚焦,运行,发现还是弹不出软键盘,再看

    

    public FindActionModeCallback(Context context) {        mCustomView = LayoutInflater.from(context).inflate(                com.android.internal.R.layout.webview_find, null);        mEditText = (EditText) mCustomView.findViewById(                com.android.internal.R.id.edit);        mEditText.setFocusable(true);        mEditText.setFocusableInTouchMode(true);        mEditText.requestFocus();        mEditText.requestFocusFromTouch();        mEditText.setCustomSelectionActionModeCallback(new NoAction());        //mEditText.setOnClickListener(this);        setText("");        mMatches = (TextView) mCustomView.findViewById(                com.android.internal.R.id.matches);        mInput = (InputMethodManager)                context.getSystemService(Context.INPUT_METHOD_SERVICE);        mResources = context.getResources();        Log.e("YQL","==================FindActionModeCallback");    }

是不是那个click监听导致失效啊,一看监听函数的实现,果然,里面就是搜寻下一个字符串,把弹软键盘的功能拦截了,果断屏蔽。。。

终于搞定一个bug,当然屏蔽的click并不会影响用户使用,因为对话窗口上还有进行上一个下一个搜索的控件。

整了两天,Android6.0的版本源码至今还是没找到showfinddialog的实现体,谁知道的话,能否告知。。。不胜感激。       


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表