Intereting Posts
Пользовательский вид onMeasure: как получить ширину по высоте Как использовать bintray jcenter для бесплатной публикации бесплатной библиотеки Android? Он просит меня зарегистрировать организацию и заплатить через месяц Как установить изображение из динамически динамически в андроид? Как установитьAlpha на Android-панель Как изменить размер текста в местах autocompletefragment в android? Как передать различные объекты в качестве параметра в AsycTask? Отображение пользовательского вида в swiped RecyclerView item В чем разница между getWidth / Height () и getMeasuredWidth / Height () в Android SDK? Android: Можно ли обновить ImageView / ImageButton с номером, чтобы показать количество новых сообщений? Hunspell на Android Проверить введенное значение – номер или нет. Как создать предпочтение, которое принимает только целочисленные значения Масштабирование проблемы на Android – почему картина такая неуклюжая? Сохранение как png-изображение в android Экспорт Android дает «Конверсия в формат Dalvik с ошибкой 1»

WebView скрывает мягкую клавиатуру во время loadUrl (), что означает, что клавиатура не может оставаться открытой при вызове javascript

Так как вы называете javascript в WebView через loadUrl («javascript: …»); Клавиатура не может оставаться открытой.

Метод loadUrl () вызывает loadUrlImpl () , который вызывает метод clearHelpers (), который затем вызывает clearTextEntry () , который затем вызывает hideSoftKeyboard (), а затем мы становимся настолько одинокими, что клавиатура уходит.

Насколько я вижу, все они являются частными и не могут быть переопределены.

Кто-нибудь нашел обходное решение для этого? Есть ли способ заставить клавиатуру оставаться открытой или напрямую вызвать javascript, не проходя через loadUrl ()?

В любом случае, чтобы переопределить WebView, чтобы предотвратить вызов (private method) метода clearTextEntry ()?

Solutions Collecting From Web of "WebView скрывает мягкую клавиатуру во время loadUrl (), что означает, что клавиатура не может оставаться открытой при вызове javascript"

Обновить

KitKat добавил публичный метод для непосредственного вызова javascript: evaluationJavascript ()

Для более старой apis вы можете попробовать решение, как показано ниже, но если бы мне пришлось это сделать снова, я бы посмотрел на создание метода совместимости, который в KitKat использует вышеупомянутый метод и на более старых устройствах, использует отражение для перехода к внутреннему Частный метод: BrowserFrame.stringByEvaluatingJavaScriptFromString ()

Затем вы можете напрямую вызвать javascript, не имея дело с loadUrl и добавив в сценарий "javascript: " .

Старый ответ

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

Вместо того, чтобы отправлять вызовы через loadUrl (), вы ставите в очередь свои javascript-вызовы, а затем javascript вытаскивает их. Что-то вроде:

 private final Object LOCK = new Object(); private StringBuilder mPendingJS; public void execJS(String js) { synchronized(LOCK) { if (mPendingJS == null) { mPendingJS = new StringBuilder(); mPendingJS.append("javascript: "); } mPendingJS .append(js) .append("; "); } } 

Вместо вызова метода loadUrl () этот метод. (Чтобы сделать это простым, я использовал синхронизированный блок, но это может быть лучше подходит для другого маршрута. Поскольку javascript работает в своем потоке, это должно быть потокобезопасным в той или иной форме).

Тогда у вашего WebView будет такой интерфейс:

 public class JSInterface { public String getPendingJS() { synchronized(LOCK) { String pendingCommands = mPendingJS.toString(); mPendingJS.setLength(0); mPendingJS.append("javascript: "); return pendingCommands; } } } 

Это возвращает строку с ожидающими командами и очищает их, чтобы они не возвращались снова.

Вы бы добавили его в WebView следующим образом:

mWebView.addJavascriptInterface(new JSInterface(), "JSInterface");

Затем в вашем javascript вы установили некоторый интервал, в который нужно сбросить отложенные команды. На каждом интервале он вызывал JSInterface.getPendingJS() который возвращал бы строку всех ожидающих команд, а затем вы могли бы их выполнить.

Вы можете улучшить это, добавив проверку в метод execJS, чтобы увидеть, существует ли в WebView поле EditText и находится в фокусе. Если он есть, вы должны использовать этот метод очередности, но если в фокусе не было ни одного, вы можете просто вызвать loadUrl (), как обычно. Таким образом, он использует это обходное решение, когда это действительно необходимо.

Что касается более старых API (до 19), я использовал аналогичный метод для ответа, но немного отличался.

Во-первых, я отслеживаю, отображается ли клавиатура с помощью javascript в webview примерно так:

 document.addEventListener( "focus", function(e){ var el = e.target; reportKeyboardDisplayedToJava( isInputElement( el ) ); }, true); document.addEventListener( "blur", function(e){ reportKeyboardDisplayedToJava( false ); }, true); 

Если клавиатура отображается, а js-инъекция выполняется на уровне Java Java – я «откладываю» эту инъекцию. Я добавляю его в список строк, позволяю пользователю завершить их ввод, а затем при исчезновении клавиатуры я обнаруживаю это и выполняю отставание от инъекций.