Мягкая клавиатура не отображается при касании в WebView DialogFragment

Изменить: я просмотрел страницу с ошибкой для этого; никакие ответы не работают. Похоже, это Android системная ошибка, которая еще не решена.

Во-первых, я сослался на этот аналогичный вопрос. Но решение этого вопроса не похоже на мое решение. У меня есть DialogFragment, который содержит только WebView. Все в WebView кажется осязаемым. Однако проблема в том, что когда я касаюсь поля формы, появляется курсор, но программная клавиатура никогда не появляется!

Вот мой код в методе onCreateDialog() в классе DialogFragment:

    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();

Как сделать так, чтобы экранная клавиатура отображалась при выборе поля формы?


person chRyNaN    schedule 14.05.2013    source источник


Ответы (1)


Это системная ошибка, которая еще не исправлена. Дополнительную информацию можно найти здесь. Похоже, что эта ошибка происходит по-разному для людей и поэтому имеет разные решения. Для моего конкретного случая есть только одно решение (поскольку я пробовал все остальное). Решение:

Сначала я создал макет для 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, и поскольку он имеет фокус, он соответствующим образом подтягивает программную клавиатуру. Я надеюсь, что это поможет любому, кто застрял в подобной ситуации.

person chRyNaN    schedule 15.05.2013
comment
Для меня мне пришлось сделать как этот хак, так и этот: stackoverflow.com/a/4977247/445348 - person cottonBallPaws; 28.05.2014
comment
Это все еще ошибка и все еще обходной путь в SDK 30 в 2021 году. - person Oded; 10.02.2021