我的情况完全一样,所以如果你找到了理想的解决方案,我很乐意听到。
编辑:
成功!或者比以前好多了,无论如何。我已经删除了我的旧解决方案,因为这个更好。
正如https://stackoverflow.com/a/10536033/513038 中所述,事实证明 loadData() 隐藏了键盘。 然而,我发现在 WebView 的 hideSoftKeyboard() 中,它通过 imm.isActive(mWebView) 检查 InputMethodManager 以查看 webview 是否处于活动状态。
因此,如果您在 loadData() 之前将焦点切换到 EditText,并在之后立即切换回 WebView,则键盘会卡住!它会短暂切换为大写,我认为在将焦点返回到 webview 时,(实际上,这似乎并不总是发生;这取决于)但它比键盘闪烁并返回要少得多。
需要做的事情的要点如下。
扩展 WebView。给它一个 EditText 字段:
public EditText mFocusDistraction;
在构造函数中,有以下几行:
mFocusDistraction = new EditText(context);
addView(mFocusDistraction);
然后重写 loadUrl():
public void loadUrl(String s) {
mFocusDistraction.requestFocus();
super.loadUrl(s);
this.requestFocus();
}
这应该让它工作,基本上。不过,它有点错误,所以这里有一个更完整的类:
import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.webkit.WebView;
import android.widget.EditText;
public class WebViewMod extends WebView {
public EditText mFocusDistraction;
public Context mContext;
public WebViewMod(Context context) {
super(context);
init(context);
}
public WebViewMod(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public WebViewMod(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public WebViewMod(Context context, AttributeSet attrs, int defStyle, boolean privateBrowsing) {
super(context, attrs, defStyle, privateBrowsing);
init(context);
}
public void init(Context context) {
// This lets the layout editor display the view.
if (isInEditMode()) return;
mContext = context;
mFocusDistraction = new EditText(context);
mFocusDistraction.setBackgroundResource(android.R.color.transparent);
this.addView(mFocusDistraction);
mFocusDistraction.getLayoutParams().width = 1;
mFocusDistraction.getLayoutParams().height = 1;
}
@Override
public void loadUrl(final String url) {
if (mContext instanceof Activity && this.isFocused()) {
((Activity)mContext).runOnUiThread(new Runnable() {
@Override
public void run() {
mFocusDistraction.requestFocus();
WebViewMod.super.loadUrl(url);
WebViewMod.this.requestFocus();
}
});
} else {
super.loadUrl(url);
}
}
}