Android WebView, як обробляти переадресації в додатку, а не відкривати браузер


120

Тож зараз у моєму додатку URL-адреса, до якої я отримую доступ, має переспрямування, і коли це станеться, WebView відкриє новий браузер, а не залишається в моєму додатку. Чи є спосіб я змінити налаштування, щоб перегляд переспрямував на URL-адресу як звичайну, але залишиться в моєму додатку, а не відкривати новий браузер?

Редагувати:

Я хочу URL-адресу для переадресації, я просто не знаю, як її створити, тому єдиний спосіб дістатися до цієї URL-адреси - це один, який спричинить переспрямування на ту, яку я хочу.

Наприклад: Перейшовши сюди: http://www.amazon.com/gp/aw/s/ref=is_box_/k=9780735622777 зверніть увагу, як він буде перенаправляти URL-адресу до фактичного продукту. У моєму додатку, якщо я відкрию його в новому браузері, це зробить це чудово, проте якщо я зберігаю його у своєму додатку з WebView, він з’явиться так, ніби він здійснює пошук k = 9780735622777, як це: http://www.amazon.com/gp/aw/s/ref=is_s_?k=k%3D9780735622777&x=0&y=0 . АБО він відкриє подання у браузері та покаже, що підходить. Однак я хочу зберігати все у своєму додатку.

Відповіді:


253

Створіть WebViewClient та замініть метод shouldOverrideUrlLoading .

webview.setWebViewClient(new WebViewClient() {
    public boolean shouldOverrideUrlLoading(WebView view, String url){
        // do your handling codes here, which url is the requested url
        // probably you need to open that url rather than redirect:
        view.loadUrl(url);
        return false; // then it is not handled by default action
   }
});

8
Я люблю відповіді, як метод () {// просто поставте код, який ви не знаєте, як тут використовувати}
JMRboosties

19
Не повторюйте код вище. Повернути помилкове з зворотного дзвінка замість виклику view.loadUrl. Виклик loadUrl вводить тонку помилку, якщо, якщо у вас є який-небудь кадр на сторінці зі URL-адресою власної схеми (скажімо, <iframe src = "tel: 123" />), він переміститься в основний кадр вашого додатка до цієї URL-адреси, що, швидше за все, порушує програму як побічний ефект.
marcin.kosiba

@ marcin.kosiba залежить від того, як він використовується, для мого використання те, що ви описуєте, не є проблемою, але я все одно ціную голову вгору :)
Warpzit

@Warpzit - впевнено, якщо ви завантажуєте у веб-перегляд лише довірений вміст і маєте 100% гарантію, що ніхто не зможе скористатися цим глюком, добре. ОТО Чому ризикувати?
marcin.kosiba

1
Як я можу знати URL-адресу, що викликається в shouldOverrideUrlLoadingметод, це наступний URL-адреса переадресації? І я хочу це дозволити?
Phan Sinh

21

Згідно з офіційною документацією , натискання будь-якого посилання в WebView запускає програму, яка обробляє URL-адреси, яка за замовчуванням є браузером. Вам потрібно змінити поведінку за замовчуванням, як це

    myWebView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }
    });

8
Ще краще просто зателефонувати до myWebView.setWebViewClient (новий WebViewClient ()); Реалізація за замовчуванням mustOverrideUrlLoading повертає значення false.
цироксис

14

Просто додавання користувацького за замовчуванням WebViewClientбуде дійсно. Це робить обробку WebView будь-якими завантаженими URL-адресами.

mWebView.setWebViewClient(new WebViewClient());

8

Перед завантаженням URL-адреси вам доведеться встановити власний метод перегляду WebviewClient shouldOverrideUrlLoading для вашого веб-перегляду.

mWebView.setWebViewClient(new WebViewClient()
        {
            @SuppressWarnings("deprecation")
            @Override
            public boolean shouldOverrideUrlLoading(WebView webView, String url)
            {
                return shouldOverrideUrlLoading(url);
            }

            @TargetApi(Build.VERSION_CODES.N)
            @Override
            public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest request)
            {
                Uri uri = request.getUrl();
                return shouldOverrideUrlLoading(uri.toString());
            }

            private boolean shouldOverrideUrlLoading(final String url)
            {
                Log.i(TAG, "shouldOverrideUrlLoading() URL : " + url);

                // Here put your code

                return true; // Returning True means that application wants to leave the current WebView and handle the url itself, otherwise return false.
            }
        });

Отримайте приклад коду для обробки URL-адрес переадресації та відкриття PDF без завантаження у веб-перегляді. https://gist.github.com/ashishdas09/014a408f9f37504eb2608d98abf49500


Зауважте, що вищезазначене посилання для прикладу коду не існує.
Jetdog

я завантажив посилання.
Ашиш Дас

Працював для мене Дякую @AshishDas +10
живець

2

Будь ласка, використовуйте наведений нижче код котліна

webview.setWebViewClient(object : WebViewClient() {
            override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {   
                view.loadUrl(url)
                return false 
            }
        })

Для отримання додаткової інформації натисніть тут


2

Створіть клас, який реалізує webviewclient та додайте наступний код, який дозволяє перевернути рядок URL, як показано нижче. Ви можете побачити ці [приклад] [1]

public class myWebClient extends WebViewClient {

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
         view.loadUrl(url); 
         return true;
     }
}

Створіть на своєму конструкторі об’єкт веб-перегляду, як показано нижче.

   web = new WebView(this); web.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); 

Потім додайте наступний код, щоб виконати завантаження URL-адрес у вашій програмі

       WebSettings settings=web.getSettings(); 
    settings.setJavaScriptEnabled(true); 
    
    web.loadUrl("http://www.facebook.com");
    web.setWebViewClient(new myWebClient()); 
   
 web.setWebChromeClient(new WebChromeClient() {
      // 
      //
    }

0
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
    super.onPageStarted(view, url, favicon);
    if (url.equals("your url")) {
        
            Intent intent = new Intent(view.getContext(), TransferAllDoneActivity.class);
            startActivity(intent);
        
    }
}

Привіт, ласкаво просимо пояснити свій код та показати нам, чому це правильна відповідь?
Алі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.