Почему Android WebView отказывается от ввода данных пользователем? - PullRequest
36 голосов
/ 18 января 2010

Я разрабатываю приложение для Android, которое использует WebView для отображения страницы входа в Facebook. Страница загружается красиво, и я могу выбрать текстовые поля для имени пользователя / пароля, но ввод их не будет работать. То есть, они определенно имеют фокус ввода (у них оранжевое поле выделения фокуса и мигающий курсор), но их ввод абсолютно ничего не делает. Я не уверен, но я думаю, что, возможно, кнопки формы также работают - они просто обновляют страницу, а не отправляют форму.

Просто чтобы прояснить, хотя я особенно заинтересован в том, чтобы запустить Facebook, я уверен, что это не проблема Facebook, поскольку другие сайты (Google и т. Д.) Также демонстрируют такое же поведение.

У кого-нибудь есть идеи, в чем может быть проблема?

Ответы [ 16 ]

44 голосов
/ 19 января 2010

Оказывается, что, по-видимому, проблема заключалась в том, что WebView не имел фокуса.

Я обнаружил, что использование клавиш со стрелками для фокусировки на текстовых полях заставляет их работать, поэтому я предположил, что где-то возникла проблема с чем-то, что не имеет фокуса, скорее всего, WebView не имеет фокуса. Конечно, добавление следующей строки, похоже, решило проблему:

webView.requestFocus(View.FOCUS_DOWN);

Я все еще затрудняюсь объяснить, почему именно проблема возникла в первую очередь - текстовые поля должны работать независимо от того, получают ли они фокус от прикосновения к ним или от того, что на них указывают стрелки, - но, по крайней мере, у меня есть решение, которое кажется, работает.

Спасибо за ваш ввод wf.

15 голосов
/ 20 октября 2010

@ Mac Есть ли в этой строке:

webView.requestFocus(View.FOCUS_DOWN);

решил твою проблему? Я не сделал в моем случае, но это делает:

mWebView.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; 
        }
});

только для вашей ссылки.

11 голосов
/ 19 ноября 2013

Большинство из них имеют

webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setUseWideViewPort(true);
webview.requestFocus(View.FOCUS_DOWN);

и, если все еще не работает, используйте одну альтернативу ниже

Альтернатива 1

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

Альтернатива 2

webview.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_UP:
                v.requestFocusFromTouch();  
                break;
        }               
        return false;
    }

});
9 голосов
/ 06 марта 2015

Я не знаю, мой случай точно такой же, как у вас,

Я обнаружил, что добавление одной строки CSS может решить проблему.

Я просто добавляю

input{
    -webkit-user-select: text;
}

на мой css, тогда проблема решена!

6 голосов
/ 29 февраля 2012

Извините, что ничего из этого не помогло мне.Я думаю, это зависит от вашего контекста.В моем случае проблема возникла во всплывающем окне html (абсолютный div).Все остальные поля ввода работали нормально.

Устранение проблемы Я обнаружил, что это ошибка в веб-просмотре.Фиксированные позиционные элементы, содержащие другие элементы с фиксированной / абсолютной позицией, прерывают поля ввода на странице.Отсюда и правило, которое я сформулировал для вас (не стесняйтесь переформулировать):

Если на вашей странице у вас есть фиксированный позиционный div с позиционированными вложенными divами по умолчанию (т.е. абсолютными), исправлено и т. д.), любой из следующих абсолютных позиционных элементов div на вашей странице, содержащих поля ввода, получит неожиданное поведение.

Итак, поместите поля ввода сверхустраницы (если вы можете) или избегать абсолютных делений, вложенных в другие фиксированные / абсолютные деления.Это должно помочь.

Я написал кое-что об этом в своем блоге, если вам нужны дополнительные объяснения и возможные обходные пути: http://java -cerise.blogspot.com / 2012/02 / android-web-view-inputfields-отбросы-to.html

5 голосов
/ 17 декабря 2014

В моем случае TabHost из предыдущего фрагмента в заднем стеке захватывал фокус из ввода WebView при каждом нажатии клавиши. Вот как я это исправил:

tabHost.addOnAttachStateChangeListener(new OnAttachStateChangeListener() {
  @Override
  public void onViewDetachedFromWindow(View v) {}

  @Override
  public void onViewAttachedToWindow(View v) {
    tabHost.getViewTreeObserver().removeOnTouchModeChangeListener(tabHost);
  }
});

Подробнее см. https://code.google.com/p/android/issues/detail?id=2516.

2 голосов
/ 27 апреля 2017

Я перепробовал все другие решения, опубликованные здесь, но ни одно из них не сработало.

Вместо этого я расширил WebView и переопределил InputConnection, что заставило KeyEvents отправлять.

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
  return new BaseInputConnection(this, false);
}
2 голосов
/ 16 августа 2015

Я трачу много времени на решение этой проблемы.Наконец, я понял, что речь идет не о WebView.В моем случае у меня есть веб-просмотр внутри диалога.Я хочу обработать обратно нажатую кнопку, чтобы отменить диалог и завершить деятельность.И я написал код ниже:

private void setOnBackPressed() {
    this.setOnKeyListener(new OnKeyListener() {
        @Override
        public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                dialog.dismiss();
                activity.finish();
            }
            return true;
        }
    });
}

Итак, когда я использую клавиатуру, этот метод как-то отклоняет все нажатия клавиш, и тогда он не появляется в текстовых полях.* Я только изменил возвращаемое значение на ложное .Итак, он работал правильно.

Надеюсь, это поможет !!

PS : этот метод внутри моего диалогового класса, который расширяет класс Dialog

2 голосов
/ 18 января 2010

Не уверен, что это проблема, поскольку другие веб-сайты также показывают то же поведение, но вы включили JavaScript? WebView не включает его по умолчанию.

WebView webView = (WebView)findViewById(R.id.yourWebView);
webView.getSettings().setJavaScriptEnabled(true);
1 голос
/ 16 июля 2013

Это случилось со мной при загрузке страницы в 4.1.2 и 4.2.2, и после одного дня поиска я нашел ответ здесь (комментарий № 18)

Цитата из исходного поста:

Некоторые из различных веб-страниц, которые я отображал с помощью WebView, не помещались должным образом в WebView, и в результате div (или некоторый другой html-компонент) незаметно накладывались на поля ввода. Хотя поля ввода казались выбранными при прикосновении, они не позволяли вводить текст (даже если бы мне удалось поднять экранную клавиатуру с помощью трекбола).

Итак, решение.

webview.getSettings().setUseWideViewPort(true);

Это не полностью остановит проблему, но сделает вид больше похожим на браузер ПК, для которого предназначены сайты. Меньше смена оверлея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...