Почему Android WebView отказывается от ввода пользователя?
Я разрабатываю приложение для Android, которое использует WebView для отображения страницы входа в Facebook. Страница загружается красиво, и я могу выбрать текстовые поля имени пользователя/пароля, но ввод в них не будет работать. То есть, у них определенно есть фокус ввода (у них есть оранжевый блок подсветки фокусировки и мигающий курсор), но ввод в них абсолютно ничего не делает. Я не уверен, но я думаю, что, возможно, кнопки формы также играют вверх - они, кажется, просто обновляют страницу, а не отправляют форму.
Просто, чтобы быть ясным, хотя я особенно заинтересован в том, чтобы запустить Facebook, я уверен, что это не проблема Facebook, поскольку другие веб-сайты (Google и т.д.) также демонстрируют то же поведение.
Есть ли у кого-нибудь идеи, что может быть проблемой?
Ответы
Ответ 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> </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
Это также произошло в моем проекте. Я пробовал все вышеперечисленные методы, ни один из них не может быть эффективным. Наконец, я решил эту проблему, используя активность темы диалога, заменив собственный диалог. Надеюсь, это поможет кому-то!