2012-02-09 5 views
5

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

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

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

(Что AlertDialog должен делать с открытием окна выбора вне меня. И нет, нет сценария, связанного с SELECT, который открывает Alert).

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

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

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

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

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

+0

В Android выпадающие списки не «выпадают» (по крайней мере, до ICS), они отображают параметры в списке внутри AlertDialog, так что откуда это происходит. Увы, я не знаю, почему проблема происходит. – dmon

+0

Вы должны опубликовать свой HTML (или образец), чтобы узнать, может ли кто-нибудь обнаружить что-то, что может вызвать сбой. Вы пробовали с более простым SELECT? – dmon

+0

Выглядит достаточно просто, насколько проще в управлении должен работать WebView? Я имею в виду, что тот же WebView обработал довольно тяжелую анимацию CSS и JS, а что нет, и все было гладко. –

ответ

0

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

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

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

+0

может предоставить рабочий код? –

+0

Желаю. Это была целая жизнь назад, и код является собственностью компании, над которой я больше не работаю. –

+0

Я должен понять, что дерьмо ВСЕГДА происходит все эти годы ?! –

1

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

2

Фактически, вы сделали то, что вы прошли Контекст приложения к просмотру веб-страниц. Тег 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"

+0

Где вы были 6 лет назад? :) –

0

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

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

Кучи любви до Manish Sharma для этого ответа.

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

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 может быть любой контекст, который наследуется от другого контекста, что вы хотели использовать.

Смежные вопросы