Android WebView долженOverrideUrlLoading для фреймов - PullRequest
3 голосов
/ 21 июля 2011

У меня есть локальный веб-сайт, контролируемый Javascript, и я загружаю его в WebView.Веб-сайт - это одна главная страница с фреймом, содержание которого изменяется в зависимости от ввода пользователя.На главной странице есть кнопка «Далее», которая запускает некоторые функции javascript и решает, какую страницу загрузить в iframe (через document.getElement (...). Src =)

В Android 2.1 все былоработает нормально - моделируется и на телефоне.Веб-просмотр загружал все страницы правильно.Я проверил его на телефоне версии 2.2 и всякий раз, когда я нажимаю кнопку Далее, страница (которая должна быть загружена в iframe) загружается в браузер по умолчанию.

Я определил фильтр намерений

   <intent-filter>
     <action android:name="android.intent.action.VIEW" />
     <category android:name="android.intent.category.DEFAULT" />
     <category android:name="android.intent.category.BROWSABLE" />
     <data
       android:scheme="file"
       android:host="*"
       android:pathPrefix="sdcard/Android/data/android.website/files/pages"
     />
    </intent-filter>

надеясь, что это перенаправит запросы страницы на активность, но это не сработает.URL все еще загружается браузером.

Использование shouldOverredeUrlLoading не работает должным образом, поскольку загруженная ссылка является ссылкой внутреннего фрейма.Вместо этого я попытался загрузить код javascript, который устанавливает этот URL-адрес в качестве источника iframe, но не работает.

Странно, что это происходит только на телефоне 2.2.В эмуляторе 2.2 все работает нормально.

Есть идеи?

Ответы [ 4 ]

8 голосов
/ 04 ноября 2013

Android 4.x работает следующим образом:

shouldOverrideUrlLoading вызывается только тогда, когда вся страница собирается измениться.

iframe - это только одна часть страницы. Поэтому shouldOverrideUrlLoading не называется.

Переопределение public WebResourceResponse shouldInterceptRequest(WebView view, String url) сработало для меня.

Кажется, нет правильного способа остановить WebResourceResponse. Вместо этого вы можете загрузить другой URL:

public WebResourceResponse shouldInterceptRequest(WebView view, String url) {

            if( url.contains("myFancyUrl") ) {

                // Do something

                try {
                    return new WebResourceResponse("", "", new URL("http://myserver.com/myrootdocument.html").openStream());
                } catch(Exception exception) {
                    Log.e( exception.toString() );
                }

            }

            return super.shouldInterceptRequest(view, url);

        }
5 голосов
/ 21 июля 2011

Попробуйте указать свой собственный WebViewClient для WebView. Вы должны переопределить shouldOverrideUrlLoading(..) и вернуть false.

1 голос
/ 24 ноября 2011

Просто подтвердив, что переопределение метода shouldOverideUrlLoading (как описано выше) также работает для меня ... Я случайно использую phonegap, поэтому мне нужно было переопределить объект GapViewClient phonegap, как показано ниже.Та же самая базовая концепция.

1 голос
/ 21 июля 2011

Я считаю, что mustOverrideUrlLoading вызывается только для начального URL страницы, а не для iFrames. Проверьте onPageFinished (также в WebViewClient). Обычно это вызывается для каждого iFrame, хотя я видел различия в поведении между Android 2.1 и 2.2.

Обратите внимание, что onPageFinished возвращает void, поэтому нет способа указать WebView не рисовать фрейм - и в любом случае он должен был нарисовать его к этой точке. Но вы всегда можете отслеживать URL-адреса в onPageFinished, а затем, когда увидите интересующий URL-адрес, скрыть веб-представление (где вам может потребоваться переключиться на другое представление), а затем начать новое действие.

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