URL पर क्लिक करने से डिफ़ॉल्ट ब्राउज़र खुल जाता है


209

मैंने अपने में एक बाहरी URL लोड किया है WebView। अब मुझे क्या जरूरत है कि जब उपयोगकर्ता लोड किए गए पृष्ठ के लिंक पर क्लिक करता है, तो उसे सामान्य ब्राउज़र की तरह काम करना पड़ता है और उसी में लिंक को खोलना पड़ता है WebView। लेकिन यह डिफ़ॉल्ट ब्राउज़र खोल रहा है और पेज लोड कर रहा है?

मैंने जावास्क्रिप्ट सक्षम किया है। लेकिन फिर भी यह काम नहीं कर रहा है। क्या मैं कुछ भूल गया हूं?

जवाबों:


353

यदि आप उपयोग कर रहे हैं WebViewतो आपको डिफ़ॉल्ट एंड्रॉइड व्यवहार नहीं चाहिए, तो आपको क्लिक को स्वयं रोकना होगा।

आप एक WebViewका उपयोग करके घटनाओं पर नजर रख सकते हैं WebViewClient। जो विधि आप चाहते हैं shouldOverrideUrlLoading()। जब आप किसी विशेष URL का चयन करते हैं तो यह आपको अपनी कार्रवाई करने की अनुमति देता है।

आप विधि का उपयोग करके WebViewClientअपने सेट करें ।WebViewsetWebViewClient()

यदि आप WebViewSDK में नमूने को देखते हैं तो एक उदाहरण है जो आपको चाहिए। यह उतना ही सरल है:

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 कृपया नमूना अपडेट करें लोड लोडल न करें। हर कोई इसे पढ़ रहा है - कृपया कोड की प्रतिकृति न करें (कॉलिंग व्यू के बजाय कॉलबैक से गलत लौटें)। कॉलिंग लोड यूआरएल एक सूक्ष्म बग का परिचय देता है, जहां यदि आपके पास कस्टम स्कीम URL के साथ पृष्ठ के भीतर कोई iframe है (जैसे <iframe src = "tel: 123" />) यह आपके ऐप के मुख्य फ्रेम को उस URL पर नेविगेट करेगा, जो एप्लिकेशन को तोड़ रहा है। एक साइड इफेक्ट।
marcin.kosiba

1
@ अदम ++ - हाँ मैंने इस पर भी ध्यान दिया - मैं समझ नहीं पाया कि मेरे वेब दृश्यों में से एक सिस्टम ब्राउज़र का उपयोग क्यों नहीं कर रहा था, और ऐसा इसलिए था क्योंकि मैंने इसमें एक नया वेबक्लाइंट जोड़ा था जो केवल ANOTHER विधि को ओवरराइड कर रहा था। मुझे डिबग करने में थोड़ा समय लगा।
पीटर अज़ताई

क्या हम ऐसा कुछ कार्यान्वित कर सकते हैं: 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);
    }           
}

यह भी खूब रही! मुझे एक वेबव्यू में लिंक से एमपी 3 फ़ाइल चलाने का तरीका जानने की कोशिश करने के कई घंटों तक बचाया। बहुत बहुत धन्यवाद realgt!
ब्रिगेंट

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)एपीआई 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

अरुलक्स जेड का जवाब बिल्कुल वही था जो मैं खोज रहा था।

मैं हाइपरलिंक्स पर क्लिक किए बिना वेब ब्राउजिंग को हाइपरलिंक्स पर क्लिक करने के लिए नेविगेशन ड्रॉअर के साथ ऐप लिख रहा हूं (इस प्रकार बाहरी वेब ब्राउज़र को लॉन्च नहीं करना)। इसके लिए यह कोड की निम्नलिखित 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");
}}

इस तरह, वेबसाइट में क्लिक किया गया हर लिंक आपके वेब व्यू के अंदर लोड हो जाएगा। (सभी एसडीके के अपडेट के साथ एंड्रॉइड स्टूडियो 1.2.2 का उपयोग करना)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.