Вложенные веб-представления в Android - PullRequest
0 голосов
/ 28 мая 2020

Я хочу создать вложенные веб-представления в Android (Java) Вот как выглядит мой поток:

Экран собственного приложения (с кнопкой) -> нажатие кнопки откроет сеть -view (скажем, web-view1), в котором размещен iframe (у меня он работает до сих пор). В этом iframe тоже есть кнопка -> нажатие кнопки открывает URL-адрес в новом окне браузера.

Как мне избежать открытия ссылки в новом окне браузера, а вместо этого отобразить ее в другом веб-представлении (например, в Интернете). -view2). web-view2 имеет кнопку, при нажатии на которую она должна быть закрыта, а элемент управления должен go вернуться к web-view1

Любые указания по достижению этого были бы очень признательны!

1 Ответ

0 голосов
/ 28 мая 2020

Важно
Для API 23 и ниже используйте устаревшую функцию shouldOverrideUrlLoading. Это также вызывается в API 24 и выше, но рекомендуется также реализовать нерекомендуемый shouldOverrideUrlLoading, так как устаревшая версия в конечном итоге исчезнет.

Короче:

  • API 23 и ниже -> Вызывается shouldOverrideUrLoading (webview, string)
  • API 24 и выше -> вызываются оба метода shouldOverrideUrlLoading

Добавьте WebViewClient в свой WebView, и тогда shouldOverrideUrlLoading станет вашим другом ( ссылка на описание метода ). Из WebResourceRequest, который является одним из параметров метода, вы можете получить URL-адрес через getUrl() подробнее здесь .

В основном этот метод вызывается при загрузке URL-адреса внутри WebView. Таким образом, вы можете вмешиваться в перенаправления.

Итак, как вы собираетесь использовать его в вашем случае?
Сначала просто добавьте WebViewClient, который переопределяет shouldOverrideUrlLoading и регистрирует URL-адрес WebResourceRequest. Таким образом, вы можете увидеть, что загружает WebView, и узнать, что это за URL при нажатии кнопки. Если этот URL-адрес c -> отлично; если это не так, это тоже нормально.

Вы сказали, что хотите показать второй WebView после нажатия кнопки, поэтому все, что вам нужно сделать, это добавить if statement внутри метода shouldOverrideUrlLoading. Он должен проверить, соответствует ли URL-адрес WebResourceRequest тому, который вы получаете при нажатии кнопки. Если нажатие кнопки всегда перенаправляет на один и тот же URL-адрес, просто соответствует всей строке. Если он совпадает только частично, сопоставьте как можно больше (чтобы никакое другое действие на веб-сайте не могло вызвать «обработку нажатия кнопки»).

Вот какой-то псевдокод:

String buttonClickUrl = "https://www.google.com/buttonClicked"

webView.webViewClient = WebViewClient() {
    boolean shouldOverrideUrlLoading(webView, request) {
        if (request.url.string == buttonClickUrl) {
           showOtherWebView()
           return true
        }
        return false
    }
}

Чтобы поставить это просто:

  • Определите с помощью URL-адреса журнала, какой URL-адрес вы должны сопоставить, чтобы идентифицировать нажатие кнопки
  • Установите постоянное значение либо с полным URL-адресом buttonClick, либо с достаточным, чтобы правильно сопоставьте его
  • Добавьте оператор if, подтверждающий, что кнопка была нажата, сопоставив текущий URL-адрес перенаправления с одним из нажатий кнопки
  • , если он соответствует, показать ваш второй веб-просмотр (загрузка URL-адреса запросов) и верните истину (указывая, что вы обработали перенаправление)

А как насчет возврата от второго к первому WebView?
В основном аналогично. установите WebViewClient, переопределив метод urlLoading, и сделайте то же самое. Если кнопка щелкнет по второму совпадению WebView -> просто установите его видимость, чтобы он исчез, и загрузите URL about:blank (чтобы WebView был «пустым»). Это все, что вам нужно сделать. Это предполагает, что второй WebView расположен поверх первого. Если это не так, и второй WebView, например, находится на другом фрагменте, просто go назад к предыдущему фрагменту, если вы правильно определяете щелчок кнопки внутри метода urlLoading.

Надеюсь, это все, что вам нужно! Я знаю, что это не просто ответ «скопируйте и вставьте», но я верю, что так вы его лучше усвоите :)

...