在 WebView 中点击表单字段不显示软键盘
Posted
技术标签:
【中文标题】在 WebView 中点击表单字段不显示软键盘【英文标题】:Tapping form field in WebView does not show soft keyboard 【发布时间】:2011-05-11 03:48:49 【问题描述】:我创建了自己的 WebView 并设置了 WebChromeClient 和 WebViewClient 对象。当我启动此 WebView 时,html 表单字段会在我触摸它们时做出反应(出现光标),但它们没有被选中,软键盘也没有启动。如果我使用轨迹球选择表格并按下它,就会出现键盘。
我尝试按照 this answer 的建议调用 myWebview.requestFocusFromTouch()
,但它返回 false 并且没有帮助。
【问题讨论】:
你这样做了吗? :***.com/questions/35465569/… 【参考方案1】:http://code.google.com/p/android/issues/detail?id=7189
这是一个修复,以防其他不清楚。
webview.requestFocus(View.FOCUS_DOWN);
webview.setOnTouchListener(new View.OnTouchListener()
@Override
public boolean onTouch(View v, MotionEvent event)
switch (event.getAction())
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_UP:
if (!v.hasFocus())
v.requestFocus();
break;
return false;
);
【讨论】:
Thx...这种行为似乎是一个错误,它已在 ICS 中修复。 @androidchen 非常感谢...您节省了我的时间 :) 我弄错了——它要我重命名“onTouch”……我该怎么办???请帮忙 你知道怎么做吗:***.com/questions/35465569/… 焦点现在好多了,字段将被选中,但仍然没有键盘。有什么想法吗?【参考方案2】:同意 Dv_MH 的回答 10%。但是,附加班有点过分了。我需要做的就是扩展 WebView 并为 onCheckIsTextEditor() 返回 true
import android.content.Context;
import android.util.AttributeSet;
import android.webkit.WebView;
public class LiveWebView extends WebView
public LiveWebView(Context context)
super(context);
public LiveWebView(Context context, AttributeSet attrs)
super(context, attrs);
public LiveWebView(Context context, AttributeSet attrs, int defStyle)
super(context, attrs, defStyle);
@Override
public boolean onCheckIsTextEditor()
return true;
从那里,我可以将它用作普通的 WebView(即使在对话框中)。
或者,使用更少的代码:
WebView web = new WebView(context)
@Override
public boolean onCheckIsTextEditor()
return true;
;
【讨论】:
这也是唯一对我有用的。其他一切都忽略了软键盘。 这对我有用(而不是第一个答案)DialogFrament
感谢您的回答。我可以打开数字键盘吗?
在 Android 7 上,在 AlertDialog 中显示 WebView,除此之外没有其他解决方案有效。谢谢。 P.S.:有人说使用自定义对话框而不是 AlertDialog 也有帮助。没试过。
现在还有更多构造函数要添加:developer.android.com/reference/android/webkit/WebView#pubctors【参考方案3】:
重要 我花了几个小时寻找这个,我通过确保扩展“ViewGroup”的父布局没有属性来解决它
android:descendantFocusability = "blocksDescendants" 防止子布局获得焦点
或 添加 android:focusable="true" 到 webview
【讨论】:
在我的项目中搜索“descendantFocusability”删除了该行,它终于奏效了。不在 webView 中,我不确定该行是如何在源代码中结束的。 如果父布局有 android:descendantFocusability = "blocksDescendants" 那么将 android:focusable="true" 属性放在子视图上不起作用。【参考方案4】:AndroidChen 的回答对我完全不起作用,但我搜索了提供的链接 (http://code.google.com/p/android/issues/detail?id=7189) 并找到了以下类,它运行良好(HTC Bravo 上的 Android Froyo),不仅是文本,还有所有按钮,重定向等,一切正常:D
class LiveWebView extends WebView
Context mContext;
public LiveWebView(Context context, String URL)
super(context);
mContext = context;
setWebViewClient(URL);
@Override
public boolean onCheckIsTextEditor()
return true;
@SuppressLint("SetjavascriptEnabled")
boolean setWebViewClient(String URL)
setScrollBarStyle(SCROLLBARS_INSIDE_OVERLAY);
setFocusable(true);
setFocusableInTouchMode(true);
requestFocus(View.FOCUS_DOWN);
WebSettings webSettings = getSettings();
webSettings.setSavePassword(false);
webSettings.setSaveFormData(false);
webSettings.setJavaScriptEnabled(true);
webSettings.setSupportZoom(false);
webSettings.setUseWideViewPort(false);
setOnTouchListener(new View.OnTouchListener()
@Override
public boolean onTouch(View v, MotionEvent event)
switch (event.getAction())
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_UP:
if (!v.hasFocus())
v.requestFocus();
break;
return false;
);
this.setWebViewClient(new WebViewClient()
ProgressDialog dialog = new ProgressDialog(mContext);
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
loadUrl(url);
return true;
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
Toast.makeText(mContext, "Oh no! " + description, Toast.LENGTH_SHORT).show();
public void onPageStarted(WebView view, String url, Bitmap favicon)
if (dialog != null)
dialog.setMessage("Loading...");
dialog.setIndeterminate(true);
dialog.setCancelable(true);
dialog.show();
public void onPageFinished(WebView view, String url)
if (dialog != null)
dialog.cancel();
);
this.setWebChromeClient(new WebChromeClient()
public void onProgressChanged(WebView view, int progress)
// Activities and WebViews measure progress with different scales.
// The progress meter will automatically disappear when we reach 100%
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result)
result.confirm();
return true;
);
loadUrl(URL);
return true;
然后为了在对话框中创建一个 webview,我编写了这段代码
AlertDialog.Builder alert = new AlertDialog.Builder(M_PaymentOptions.this);
alert.setNegativeButton("Back to Payment Options", new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialog, int id)
);
alert.setTitle("BarclayCard Payment");
LiveWebView liveWevViewObject = new LiveWebView(M_PaymentOptions.this, redirecturl);
alert.setView(liveWevViewObject);
alert.show();
【讨论】:
谢谢你,Dv_MH!接受的答案对我也不起作用,但这一个有效。【参考方案5】:只需在WebView下添加不可见的EditText
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_
android:layout_>
<EditText
android:layout_
android:layout_
android:visibility="invisible" />
<WebView
android:id="@+id/webView"
android:layout_
android:layout_/>
所有这些与焦点相关的解决方案都不适用于我的三星 Note 3/Android 5.0
【讨论】:
【参考方案6】:正如 Google 问题跟踪器 上提到的here,此修复工作正常。不需要其他任何东西。
webView.isFocusable = true
webView.isFocusableInTouchMode = true
webView.requestFocus(View.FOCUS_DOWN)
【讨论】:
【参考方案7】:对于任何在 DialogFragment(或者可能是一般的 Dialog)中具有此功能的人,这可能与此错误有关:https://issuetracker.google.com/issues/36915710
这是对我有用的解决方法:
https://***.com/a/16573061/1316677
总结:在Dialog的布局中创建一个不可见/“消失”的EditText,然后调用:
EditText edit = view.findViewById(R.id.editText);
edit.setFocusable(true);
edit.requestFocus();
【讨论】:
以上是关于在 WebView 中点击表单字段不显示软键盘的主要内容,如果未能解决你的问题,请参考以下文章