在WebView DialogFragment中触摸时软键盘不显示

3

编辑: 我查看了此错误页面,但没有找到解决方法。看起来这是一个Android系统的bug,尚未得到解决。

首先,我参考了这个类似的问题。但那个问题的解决方案似乎并不适用于我的情况。我有一个只包含WebViewDialogFragment。在WebView中,所有东西都是可触摸的。然而,问题在于当我触摸表单字段时,光标出现了,但软键盘却从未出现!

以下是DialogFragment类中onCreateDialog()方法中的代码:

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    WebView web = new WebView(getActivity());
    web.loadUrl(InternetDialog.this.url);
    web.setFocusable(true);
    web.setFocusableInTouchMode(true);
    web.requestFocus(View.FOCUS_DOWN);
    web.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;
        }
    });

    builder.setView(web);
    return builder.create();

当我选中表单字段时,如何让软键盘显示出来?

1个回答

14
这是一个尚未修复的系统漏洞。点击此处可获取更多信息。似乎这个漏洞因人而异,因此也有不同的解决方案。对于我的情况,只有一个解决方案(因为我已经尝试了所有其他方法)。解决方案如下:
首先,我创建了一个用于 Dialog 的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

<EditText
    android:id="@+id/edit"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="true"
    android:visibility="invisible"/>

<WebView
    android:id="@+id/web"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

</RelativeLayout>

然后,在DialogFragment类中的onCreateDialog方法中:

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    LayoutInflater inflater = LayoutInflater.from(getActivity());
    View v = inflater.inflate(R.layout.internet_dialog, null);

    WebView web = (WebView) v.findViewById(R.id.web);
    EditText edit = (EditText) v.findViewById(R.id.edit);
    edit.setFocusable(true);
    edit.requestFocus();
    web.loadUrl(url);
    this.webView = web;
    builder.setView(v);

    return builder.create();

至于为什么这样做可行,是因为我创建了一个EditText并将焦点设置在它上面,同时让它不可见。由于EditText是不可见的,所以不会干扰WebView,同时由于它具有焦点,可以适当地弹出软键盘。我希望这能帮助那些遇到类似情况的人。


对我来说,我不得不同时执行这个hack和这个:https://dev59.com/L2855IYBdhLWcg3wsWhq#4977247 - cottonBallPaws
2
这在2021年的SDK 30中仍然是一个bug,并且仍然需要解决。 - Oded
这仍然是一个错误,并且在2022年的SDK 31中仍然需要解决。 - Regex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接