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的实现体,谁知道的话,能否告知。。。不胜感激。