Подтвердить что ты не робот

Почему Android WebView отказывается от ввода пользователя?

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

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

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

4b9b3361

Ответ 1

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

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

webView.requestFocus(View.FOCUS_DOWN);

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

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

Ответ 2

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

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

Ответ 3

У большинства из них

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

});

Ответ 4

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

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

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

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

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

Ответ 5

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

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

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

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

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

Ответ 6

В моем случае 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.

Ответ 7

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

WebView webView = (WebView)findViewById(R.id.yourWebView);
webView.getSettings().setJavaScriptEnabled(true);

Ответ 8

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

Вместо этого я расширил WebView и перепробовал InputConnection, который заставил KeyEvents отправляться.

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
  return new BaseInputConnection(this, false);
}

Ответ 9

Я столкнулся с этой проблемой, потому что я показываю всплеск, пока веб-просмотр загружает первую страницу. Я устанавливаю webview на View.VISIBLE в onPageFinished, однако, несмотря на возможность фокусировки текстовых полей, вы не можете вводить их. Я также могу подтвердить, что исправление для установки запроса веб-просмотраFocus на View.FOCUS_DOWN работает.

NB. Если я установил webview в View.VISIBLE в onResume, проблема не представится, но в моем случае всплывающее изображение исчезнет слишком быстро.

Ответ 10

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

Цитата из исходного сообщения:

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

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

webview.getSettings().setUseWideViewPort(true);

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

Ответ 11

Я нашел проблему, которая может быть другой, но она кажется похожей. В собственном браузере Android 2.0, если у вас есть фиксированные элементы позиции на странице, он иногда разбивает поля выбора.

Обходной путь для этой проблемы для устройств 2.3 - никогда не допускать пустых дочерних элементов для родительской позиции с фиксированной позицией. Таким образом,

<div style="position:fixed">
  <div>
    <span>not empty</span>
    <span></span>
  </div>
</div>

станет

<div style="position:fixed">
  <div>
    <span>not empty</span>
    <span>&nbsp;</span>
  </div>
</div>

Это исправило мою проблему.

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

Ответ 12

в моем контексте (веб-просмотр, содержащий внешний URL), этот фрагмент работает:

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

});

ошибка заключается в том, что при каждом касании веб-просмотр терял фокус!

Ответ 13

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

После длительного поиска решения я обнаружил, что это устраняет проблему:

body {
    -webkit-transform: translate3d(0,0,0);
    -moz-transform: translate3d(0,0,0);
    -ms-transform: translate3d(0,0,0);
    -o-transform: translate3d(0,0,0);
    transform: translate3d(0,0,0);
}

Как я понял, это правило заставляет некоторые устройства запускать аппаратное ускорение. Подробнее о translate3d (0,0,0) здесь.

С другой стороны, в соответствии с этой статьей не рекомендуется использовать ускорение GPU во всем мире.

Ответ 14

Я трачу много времени на решение этой проблемы. Наконец, я понял, что речь идет не о WebView. В моем случае у меня есть внутренний диалог 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;
        }
    });
}

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

Я только изменил возвращаемое значение на false. Таким образом, он работал правильно.

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

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

Ответ 15

Если мы имеем дело с EditText в WebView, то v.requestFocusFromTouch () не будет работать, если мы должны USER_AGENT записать Mozilla/5.0 (X11; Linux i686) и будем работать нормально, если Mozilla/5.0 (X11, Linux x86_64).

Ответ 16

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