Android WebView วิธีจัดการการเปลี่ยนเส้นทางในแอปแทนการเปิดเบราว์เซอร์


120

ตอนนี้ในแอปของฉัน URL ที่ฉันเข้าถึงมีการเปลี่ยนเส้นทางและเมื่อสิ่งนี้เกิดขึ้น WebView จะเปิดเบราว์เซอร์ใหม่แทนที่จะอยู่ในแอปของฉัน มีวิธีใดบ้างที่ฉันสามารถเปลี่ยนการตั้งค่าเพื่อให้ View เปลี่ยนเส้นทางไปยัง URL เหมือนปกติ แต่ยังคงอยู่ในแอปของฉันแทนที่จะเปิดเบราว์เซอร์ใหม่

แก้ไข:

ฉันต้องการเปลี่ยนเส้นทาง 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
ฉันชอบคำตอบที่เหมือนกับ method () {// เพียงแค่ใส่รหัสที่คุณไม่รู้ว่าจะใช้อย่างไรที่นี่}
JMRboosties

19
โปรดอย่าจำลองรหัสด้านบน ส่งคืนเท็จจากการเรียกกลับแทนที่จะเรียก view.loadUrl แทน การเรียก loadUrl จะแนะนำข้อบกพร่องเล็กน้อยที่หากคุณมี iframe ใด ๆ ภายในหน้าเว็บที่มี URL ของโครงร่างที่กำหนดเอง (พูดว่า <iframe src = "tel: 123" />) ระบบจะนำทางเฟรมหลักของแอปไปยัง URL นั้นซึ่งมักจะทำให้แอปเสียหาย ผลข้างเคียง
marcin.kosiba

@ marcin.kosiba ขึ้นอยู่กับวิธีการใช้สำหรับกรณีการใช้งานของฉันสิ่งที่คุณอธิบายไม่ใช่ปัญหา แต่ฉันยังคงรู้สึกขอบคุณ :)
Warpzit

@Warpzit - แน่นอนว่าหากคุณโหลดเฉพาะเนื้อหาที่เชื่อถือได้ลงใน webview และมีการรับประกัน 100% ว่าไม่มีใครสามารถใช้ประโยชน์จากข้อผิดพลาดนั้นได้ OTOH เสี่ยงทำไม?
marcin.kosiba

1
จะรู้ได้อย่างไรว่า url ที่เรียกเข้าไปในshouldOverrideUrlLoadingmethod คือ next redirect url? และฉันต้องการอนุญาตหรือไม่
Phan Sinh

21

ตามเอกสารอย่างเป็นทางการการคลิกที่ลิงค์ใดก็ได้ใน WebView จะเปิดแอปพลิเคชันที่จัดการ URL ซึ่งโดยค่าเริ่มต้นคือเบราว์เซอร์ คุณต้องลบล้างพฤติกรรมเริ่มต้นเช่นนี้

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

8
ดีไปกว่านั้นเพียงแค่เรียก myWebView.setWebViewClient (WebViewClient ใหม่ ()); การใช้งานดีฟอลต์ของ shouldOverrideUrlLoading จะส่งกลับเท็จ
cyroxis

14

เพียงแค่เพิ่มค่าเริ่มต้นที่กำหนดเองWebViewClientจะทำ สิ่งนี้ทำให้ WebView จัดการกับ URL ที่โหลดเอง

mWebView.setWebViewClient(new WebViewClient());

8

คุณจะต้องตั้งค่าวิธีการแทนที่ WebviewClient ที่กำหนดเองของคุณควรOverrideUrlLoadingสำหรับ webview ของคุณก่อนที่จะโหลด url

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 โดยไม่ต้องดาวน์โหลดใน webview https://gist.github.com/ashishdas09/014a408f9f37504eb2608d98abf49500


โปรดทราบว่าลิงก์ด้านบนสำหรับโค้ดตัวอย่างไม่มีอยู่
Jetdog

ฉันได้อัปโหลดลิงค์
Ashish Das

ทำงานให้ฉันขอบคุณ @AshishDas +10
livemaker

2

กรุณาใช้รหัส kotlin ด้านล่าง

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;
     }
}

บนตัวสร้างของคุณสร้างวัตถุ webview ดังที่แสดงด้านล่าง

   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);
        
    }
}

สวัสดียินดีต้อนรับคุณต้องการอธิบายรหัสของคุณและแสดงให้เราเห็นว่าเหตุใดจึงเป็นคำตอบที่ถูกต้อง
Ali
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.