在 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 中点击表单字段不显示软键盘的主要内容,如果未能解决你的问题,请参考以下文章

联想手机A65打电话时不显示软键盘怎么设置出来?

vue 软键盘采坑

软键盘出现时如何保持Android webview中的固定页脚不覆盖输入字段?

软键盘显示与隐藏的监听

webview中的iOS键盘样式?

Android中WebView中的文本字段被键盘隐藏