При попытке открыть тег SELECT в Android WebView происходит сбой приложения - PullRequest
5 голосов
/ 09 февраля 2012

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

У меня есть это приложение, которое запускает несколько HTML-страниц в WebView. Все выглядит хорошо и работает нормально, пока вы не попытаетесь открыть тег SELECT - бум, приложение вылетает. Вот стек трассировки, если это поможет:

Тема [<1> main] (Приостановлено (исключение WindowManager $ BadTokenException)) AlertDialog (Dialog) .show () строка: 247
WebView $ InvokeListBox.run () строка: 7841
WebView $ PrivateHandler (обработчик) .handleCallback (сообщение) строка: 587
WebView $ PrivateHandler (обработчик) .dispatchMessage (сообщение) строка: 92
Строка Looper.loop (): 130 Строка ActivityThread.main (String []): 3859
Строка Method.invokeNative (Object, Object [], Class, Class [], Class, int, boolean): недоступно [собственный метод]
Строка Method.invoke (Object, Object ...): 507
ZygoteInit $ MethodAndArgsCaller.run () строка: 840
ZygoteInit.main (String []) строка: 598 NativeStart.main (String []) строка: недоступно [собственный метод]

(Какое отношение AlertDialog имеет к открытию окна выбора, мне неведомо. И нет, с SELECT не связан скрипт, открывающий предупреждение).

Теперь вот лучшая часть. Я тестирую приложение на 2 устройствах: Samsung Galaxy S2 с ОС 2.3.3 и Motorola RAZR XT910 с ОС 2.3.5. На самсунге все прекрасно работает. На RAZR, однако, вышеперечисленное происходит.

Страницы довольно тяжелые с CSS и JavaScript, но они ломаются, даже если все удалено. На самом деле, пустой HTML с одним элементом управления SELECT по-прежнему падает. Несколько вещей, упомянутых в вопросе год назад, которые я попробовал:

  • Удаление всех элементов с абсолютным и фиксированным позиционированием из HTML (фактически я удалил весь CSS, просто чтобы посмотреть, имеет ли он какой-либо эффект - нет).
  • Гарантия того, что SELECT написан отдельно, без поддельных атрибутов / тегов.

Ничего не помогло.

Кто-нибудь имеет хоть малейшее представление о том, что может быть причиной этого?

Ответы [ 4 ]

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

На самом деле вы передали Контекст приложения веб-представлению. Тег SELECT в основном отображает свои параметры, используя собственный Android AlertDialog , для которого требуется Контекст активности .

Чтобы устранить эту проблему, вы можете передать Контекст деятельности через файл макета (XML), как показано ниже.

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:fitsSystemWindows="true"
    tools:context="com.myApp.Activities.WebViewActivity">

    <WebView
            tools:context="com.myApp.Activities.WebViewActivity"
            android:layout_width="match_parent"
            android:id="@+id/webView"
            android:layout_height="match_parent"/>

</LinearLayout>

инструменты: контекст = "com.myApp.Activities.WebViewActivity"

1 голос
/ 20 декабря 2015

Сбой, потому что вы дали ApplicationContext веб-представлению.При щелчке по тегу SELECT Android отображает свои параметры с помощью собственного AlertDialog.
Веб-представление должно быть создано с контекстом Activity, поскольку для экземпляра AlertDialog требуется контекст Activity.

0 голосов
/ 10 января 2018

Поздно к игре, но я читал в течение половины рабочего дня, пробовал разные решения в течение нескольких рабочих дней и возвращался к этой теме снова и снова.У меня был фрагмент с Webview внутри, и версии Android до Oreo (28) зависали при выборе выбора в HTML, в то время как 28+ просто игнорировали его.

Это то, что Диффи сказал и Igor_K сказал (хотя решение Диффи не сработало): это неправильный контекст.Что заставило меня решить, это была эта тема .Я скопирую и вставлю ответ ниже:

Кучи любви к Маниш Шарма для этого ответа.

Чтобы передать новый контекст веб-представлению, вы можете создатьметод для инициализации веб-просмотра, передавая аргумент Context, как показано ниже:

public static Webview initializeWebView(Context context)
{

  myWebView = new WebView();
  return myWebView;

}

И после этого вы можете вызывать этот метод везде, где захотите и когда захотите.Вы можете вызвать это, как показано ниже:

myWebView = initializeWebView(YourActivityName.this);
//this way whatever Context you will pass your webview will be initialized that way
//for example you can also pass getApplicationContext() as an Argument
myWebView = initializeWebView(getApplicationContext());
//or
myWebView = initializeWebView(customContext);

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

0 голосов
/ 09 апреля 2012

Проработав более месяца в Интернете, я сдался и перевел все SELECT на собственный код.

Заменим SELECT чем-то, похожим на SELECT, обработчик связывания клика, который запускает методна JavascriptInterface и передайте ему значения опции SELECTs, позвольте методу открыть Dialog с RadioGroup, заполните группу RadioButton s, представляющими опции.Когда выбрано, разрешите индекс и передайте его обратно в JavaScript (экземпляр SELECT, который запустил процесс, должен быть сначала сохранен в некоторой переменной).

Это ужасно ужасно, но, к сожалению, больше ничего не получалось.

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