การคลิก URL จะเป็นการเปิดเบราว์เซอร์เริ่มต้น


209

ฉันได้โหลด URL WebViewภายนอกในของฉัน WebViewตอนนี้สิ่งที่ฉันต้องการก็คือว่าเมื่อผู้ใช้คลิกที่ลิงก์ในหน้าโหลดก็มีการทำงานเหมือนปกติเบราว์เซอร์และเปิดการเชื่อมโยงในเดียวกัน แต่มันกำลังเปิดเบราว์เซอร์เริ่มต้นและโหลดหน้านั้นหรือไม่

ฉันได้เปิดใช้งาน JavaScript แต่ก็ยังไม่ทำงาน ฉันลืมอะไรไปหรือเปล่า

คำตอบ:


353

หากคุณกำลังใช้งานอยู่WebViewคุณจะต้องสกัดกั้นการคลิกด้วยตัวคุณเองหากคุณไม่ต้องการพฤติกรรมเริ่มต้นของ Android

คุณสามารถตรวจสอบเหตุการณ์ที่เกิดขึ้นในการใช้WebView วิธีการที่คุณต้องการคือWebViewClient shouldOverrideUrlLoading()สิ่งนี้ช่วยให้คุณสามารถดำเนินการของคุณเองเมื่อมีการเลือก URL เฉพาะ

คุณตั้งค่าWebViewClientของคุณWebViewโดยใช้วิธีการsetWebViewClient()

ถ้าคุณดูWebViewตัวอย่างใน SDKมีตัวอย่างที่ทำในสิ่งที่คุณต้องการ มันง่ายเหมือน:

private class HelloWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
}

97
ดูเหมือนว่านี่เป็นพฤติกรรมเริ่มต้นสำหรับWebViewClientและไม่จำเป็นต้องมีคลาสย่อยหากเป็นสิ่งที่คุณทำ ฉันได้รับสิ่งนี้เพื่อทำงานเพียงแค่ทำmyWebView.setWebViewClient(new WebViewClient());
อดัม

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

1
@Adam ++ - ใช่ฉันก็สังเกตเห็นเช่นกัน - ฉันไม่เข้าใจว่าทำไมหนึ่งในมุมมองเว็บของฉันไม่ได้ใช้เบราว์เซอร์ระบบและเป็นเพราะฉันได้เพิ่ม webclient ใหม่ให้กับมันซึ่งเป็นวิธีเดียวที่เหนือกว่า ฉันใช้เวลาสักครู่เพื่อตรวจแก้จุดบกพร่อง
Peter Ajtai

เราสามารถใช้สิ่งที่ชอบ: onLongClick, เปิดลิงก์ในเบราว์เซอร์ภายนอกได้หรือไม่?
TheOnlyAnil

54

ในบางกรณีคุณอาจต้องการแทนที่ onLoadResource หากคุณได้รับการเปลี่ยนเส้นทางซึ่งไม่ได้เรียกวิธีการโหลด URL ในกรณีนี้ฉันลองต่อไปนี้:

@Override
public void onLoadResource(WebView view, String url)
{
    if (url.equals("http://redirectexample.com"))
    {
        //do your own thing here
    }
    else
    {
        super.onLoadResource(view, url);
    }           
}

มันเยี่ยมมาก! ช่วยฉันหลายชั่วโมงในการพยายามหาวิธีเล่นไฟล์ MP3 จากลิงก์ในเว็บวิว ขอบคุณมาก realgt!
Brigante

25

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

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

หรือถ้าไม่มีเงื่อนไขเชิงตรรกะในวิธีการเพียงแค่ทำเช่นนี้

myWebView.setWebViewClient(new WebViewClient());

15

เพิ่ม 2 บรรทัดนี้ในรหัสของคุณ -

mWebView.setWebChromeClient(new WebChromeClient()); 
mWebView.setWebViewClient(new WebViewClient());

9

วิธีการที่boolean shouldOverrideUrlLoading(WebView view, String url)ได้รับการคัดค้านใน API 24. boolean shouldOverrideUrlLoading (WebView view, WebResourceRequest request)หากคุณกำลังสนับสนุนอุปกรณ์ใหม่ที่คุณควรใช้

คุณสามารถใช้ทั้งสองอย่างโดยทำสิ่งนี้:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    newsItem.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            view.loadUrl(request.getUrl().toString());
            return true;
        }
    });
} else {
    newsItem.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    });
}

6

คำตอบของ Arulx Z คือสิ่งที่ฉันกำลังมองหา

ฉันกำลังเขียนแอพด้วย Navigation Drawer พร้อม recyclerview และ webviews เพื่อให้เว็บเบราส์ภายในแอพโดยไม่คำนึงถึงการคลิกไฮเปอร์ลิงก์ (ดังนั้นจึงไม่เปิดเว็บเบราว์เซอร์ภายนอก) เพื่อที่จะพอเพียงใส่รหัส 2 บรรทัดต่อไปนี้:

mWebView.setWebChromeClient(new WebChromeClient()); mWebView.setWebViewClient(new WebViewClient());

ภายใต้คำสั่ง WebView ของคุณ

นี่คือตัวอย่างของรหัส WebView ของฉัน:

public class WebView1 extends AppCompatActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    WebView wv = (WebView) findViewById(R.id.wv1); //webview statement
    wv.setWebViewClient(new WebViewClient());    //the lines of code added
    wv.setWebChromeClient(new WebChromeClient()); //same as above

    wv.loadUrl("http://www.google.com");
}}

ด้วยวิธีนี้ทุกลิงก์ที่คลิกในเว็บไซต์จะโหลดภายใน WebView ของคุณ (ใช้ Android Studio 1.2.2 พร้อมอัปเดต SDK ทั้งหมด)

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