SetWebViewClient बनाम setWebChromeClient में क्या अंतर है?


जवाबों:


148

से स्रोत कोड :

// Instance of WebViewClient that is the client callback.
private volatile WebViewClient mWebViewClient;
// Instance of WebChromeClient for handling all chrome functions.
private volatile WebChromeClient mWebChromeClient;

// SOME OTHER SUTFFF.......

/**
 * Set the WebViewClient.
 * @param client An implementation of WebViewClient.
 */
public void setWebViewClient(WebViewClient client) {
    mWebViewClient = client;
}

/**
 * Set the WebChromeClient.
 * @param client An implementation of WebChromeClient.
 */
public void setWebChromeClient(WebChromeClient client) {
    mWebChromeClient = client;
}

WebChromeClient का उपयोग करने से आप जावास्क्रिप्ट संवाद, फ़ेविकॉन, शीर्षक और प्रगति को संभाल सकते हैं। इस उदाहरण पर एक नज़र डालें: WebView में अलर्ट () समर्थन जोड़ना

पहली नज़र में, कई अंतर हैं WebViewClient और WebChromeClient । लेकिन, मूल रूप से: यदि आप एक WebView विकसित कर रहे हैं, जिसमें बहुत अधिक सुविधाओं की आवश्यकता नहीं है, लेकिन HTML का प्रतिपादन करते हुए, आप बस एक का उपयोग कर सकते हैं WebViewClient। दूसरी ओर, यदि आप (उदाहरण के लिए) उस पृष्ठ के फेविकॉन को लोड करना चाहते हैं जिसे आप प्रस्तुत कर रहे हैं, तो आपको एक WebChromeClientवस्तु का उपयोग करना चाहिए और ओवरराइड करना चाहिए onReceivedIcon(WebView view, Bitmap icon)

ज्यादातर बार, अगर आप उन चीजों के बारे में चिंता नहीं करना चाहते हैं ... तो आप यह कर सकते हैं:

webView= (WebView) findViewById(R.id.webview); 
webView.setWebChromeClient(new WebChromeClient()); 
webView.setWebViewClient(new WebViewClient()); 
webView.getSettings().setJavaScriptEnabled(true); 
webView.loadUrl(url); 

और आपके WebView (सिद्धांत में) सभी विशेषताओं को लागू किया जाएगा (Android देशी ब्राउज़र के रूप में)।


26
इस रूप में, उत्तर पूर्ण नहीं है। ChromeClient एन्यूमरेटेड चीजों को संभालने की अनुमति देता है लेकिन ViewClient क्या है और समानताएं और अंतर क्या हैं?
पेंटियम

3
क्या यह विधि डिफ़ॉल्ट वेबव्यू की कुछ ख़राब सुविधाओं को बेहतर बनाने में मदद करेगी? विशेष रूप से css3 एनिमेशन और बदलाव के लिए?
अता इरावानी 12

1
क्या मैं एक साथ दोनों का उपयोग कर सकता हूं?
सर्गेई डिरिन

1
@SergeyDirin: stackoverflow.com/a/6475858 । इस उत्तर को देखें, आप एक ही बार में दोनों का उपयोग कर सकते हैं।
होआंग्टु २३

अगर क्रोम न हो तो वेबव्यूक्लिअर में कैमरे की अनुमति कैसे संभालें?
j2emanue

100

मुझे लगता है कि इस सवाल के लिए थोड़ा और विवरण चाहिए। मेरा उत्तर एंड्रॉइड प्रोग्रामिंग, द नर्ड रेंच गाइड (द्वितीय संस्करण) से प्रेरित है।

डिफ़ॉल्ट रूप से , WebView में जावास्क्रिप्ट बंद है। आपको इसे हमेशा चालू रखने की आवश्यकता नहीं है, लेकिन कुछ ऐप्स के लिए, इसकी आवश्यकता हो सकती है।

WebView को कॉन्फ़िगर करने के बाद URL को लोड करना पड़ता है, इसलिए आप ऐसा करते हैं। इससे पहले, आप getSettings()WebSettings और कॉलिंग का एक उदाहरण प्राप्त करने के लिए कॉल करके जावास्क्रिप्ट चालू करते हैं WebSettings.setJavaScriptEnabled(true)। WebSettings तीन तरीकों में से पहला तरीका है जिसे आप अपने WebView को संशोधित कर सकते हैं। इसमें विभिन्न गुण हैं जिन्हें आप उपयोगकर्ता एजेंट स्ट्रिंग और पाठ आकार की तरह सेट कर सकते हैं।

उसके बाद, आप अपने WebViewClient को कॉन्फ़िगर करें। WebViewClient एक इवेंट इंटरफ़ेस है। WebViewClient के अपने स्वयं के कार्यान्वयन को प्रदान करके, आप घटनाओं का प्रतिपादन कर सकते हैं। उदाहरण के लिए, आप यह पता लगा सकते हैं कि रेंडरर किसी विशेष URL से छवि लोड करना शुरू कर देता है या यह तय कर लेता है कि सर्वर पर POST के अनुरोध को फिर से जमा करना है या नहीं।

WebViewClient में कई विधियाँ हैं जिन्हें आप ओवरराइड कर सकते हैं, जिनमें से अधिकांश से आप निपटेंगे नहीं। हालाँकि, आपको डिफ़ॉल्ट WebViewClient के कार्यान्वयन को बदलने की आवश्यकता है shouldOverrideUrlLoading(WebView, String)। यह विधि निर्धारित करती है कि जब एक नया URL WebView में लोड होता है, जैसे किसी लिंक को दबाने से क्या होगा। यदि आप सच लौटाते हैं, तो आप कह रहे हैं, "इस URL को हैंडल न करें, मैं इसे खुद संभाल रहा हूं।" यदि आप झूठे लौटते हैं, तो आप कह रहे हैं, "आगे बढ़ो और इस URL को लोड करो, WebView, मैं इसके साथ कुछ नहीं कर रहा हूँ।"

डिफ़ॉल्ट कार्यान्वयन URL के साथ एक अंतर्निहित इरादे को आग लगाता है, जैसे आपने पहले किया था। हालांकि, हालांकि, यह एक गंभीर समस्या होगी। कुछ वेब एप्लिकेशन जो पहली चीज करते हैं वह आपको वेबसाइट के मोबाइल संस्करण पर पुनर्निर्देशित करता है। डिफ़ॉल्ट WebViewClient के साथ, इसका मतलब है कि आपको तुरंत उपयोगकर्ता के डिफ़ॉल्ट वेब ब्राउज़र पर भेजा जाता है। यह वही है जो आप बचने की कोशिश कर रहे हैं। फिक्स सरल है - बस डिफ़ॉल्ट कार्यान्वयन को ओवरराइड करें और गलत लौटें।

WebChromeClient का उपयोग चीजों को तैयार करने के लिए करें क्योंकि आप अपना खुद का WebView बनाने के लिए समय निकाल रहे हैं, चलो इसे एक प्रगति पट्टी जोड़कर थोड़ा लोड करें और टूलबार के उपशीर्षक को लोड किए गए पृष्ठ के शीर्षक के साथ अपडेट करें।

ProgressBar को हुक करने के लिए, आप WebView पर दूसरी कॉलबैक का उपयोग करेंगे WebChromeClient:।

WebViewClient रेंडरिंग इवेंट्स का जवाब देने के लिए एक इंटरफ़ेस है; WebChromeClient उन घटनाओं पर प्रतिक्रिया करने के लिए एक इवेंट इंटरफ़ेस है जो ब्राउज़र के चारों ओर क्रोम के तत्वों को बदलना चाहिए। इसमें जावास्क्रिप्ट अलर्ट, फ़ेविकॉन और लोडिंग प्रगति के लिए निश्चित रूप से अपडेट और वर्तमान पृष्ठ का शीर्षक शामिल है।

इसे हुक अप करें onCreateView(…)। WebChromeClient का उपयोग करके चीजों को प्रगति के अपडेट और शीर्षक अपडेट के लिए प्रत्येक की अपनी कॉलबैक विधि है, onProgressChanged(WebView, int)और onReceivedTitle(WebView, String)। आपके द्वारा प्राप्त की जाने वाली प्रगति onProgressChanged(WebView, int)0 से 100 तक पूर्णांक है। यदि यह 100 है, तो आप जानते हैं कि पृष्ठ लोड हो रहा है, इसलिए आप इसकी दृश्यता सेट करके प्रोग्रेसबार को छिपाते हैं View.GONE

डिस्क्लेमर: यह जानकारी Android प्रोग्रामिंग: द बिग नर्ड रेंच गाइड से ली गई थी जिसमें लेखकों से अनुमति ली गई थी। इस पुस्तक के बारे में अधिक जानकारी के लिए या कॉपी खरीदने के लिए, कृपया bignerdranch.com पर जाएँ।


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