2010-11-04 4 views
16

मैंने एक वेबव्यू लेआउट बनाया है, जिसका उपयोग किसी विशिष्ट वेबसाइट तक पहुंचने के लिए किया जाता है, हालांकि यह एक कस्टम "वेब पेज" उपलब्ध नहीं है, जब संसाधन हैंडसेट में नेटवर्क कनेक्शन नहीं है या संसाधन पृष्ठ के समय बाहर। मैं जानता हूँ कि यह संभव है यदि आप एप्लिकेशन "Wikidroid" जबकि एक हैंडसेट हवाई जहाज मोड में है आप प्राप्त "अनुच्छेद नहीं उपलब्ध" मानक Android "वेब पेज उपलब्ध नहीं है" त्रुटि पृष्ठ के बजाय त्रुटि पृष्ठ को खोलने क्योंकि ।वेबव्यू के लिए कस्टम त्रुटि पृष्ठ को संपादित या बनाने के लिए कैसे?

मैंने इंटरनेट पर उच्च और निम्न खोज की है और इस अनुरोध को संबोधित करने वाले किसी भी ऑनलाइन संसाधन के साथ नहीं आया है। किसी भी और सभी मदद की बहुत सराहना की है। अग्रिम में धन्यवाद।

उत्तर

19

यह निर्धारित करने के लिए कि डिवाइस के पास नेटवर्क कनेक्शन कब है, अनुमति <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> पर अनुरोध करें और फिर आप निम्न कोड से जांच सकते हैं। पहले कक्षा चर के रूप में इन चर को परिभाषित करें।

private Context c; 
private boolean isConnected = true; 

अपने onCreate() विधि में c = this;

प्रारंभ फिर कनेक्टिविटी के लिए जाँच करें।

ConnectivityManager connectivityManager = (ConnectivityManager) 
    c.getSystemService(Context.CONNECTIVITY_SERVICE); 
if (connectivityManager != null) { 
    NetworkInfo ni = connectivityManager.getActiveNetworkInfo(); 
    if (ni.getState() != NetworkInfo.State.CONNECTED) { 
     // record the fact that there is not connection 
     isConnected = false; 
    } 
} 

फिर WebView requets अवरोधन करने के लिए, आप निम्नलिखित की तरह कुछ कर सकता है। यदि आप इसका उपयोग करते हैं, तो आप शायद onReceivedError विधि में उपलब्ध कुछ जानकारी शामिल करने के लिए त्रुटि संदेशों को कस्टमाइज़ करना चाहेंगे।

final String offlineMessageHtml = "DEFINE THIS"; 
final String timeoutMessageHtml = "DEFINE THIS"; 

WebView browser = (WebView) findViewById(R.id.webview); 
browser.setNetworkAvailable(isConnected); 
browser.setWebViewClient(new WebViewClient() { 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     if (isConnected) { 
      // return false to let the WebView handle the URL 
      return false; 
     } else { 
      // show the proper "not connected" message 
      view.loadData(offlineMessageHtml, "text/html", "utf-8"); 
      // return true if the host application wants to leave the current 
      // WebView and handle the url itself 
      return true; 
     } 
    } 
    @Override 
    public void onReceivedError (WebView view, int errorCode, 
     String description, String failingUrl) { 
     if (errorCode == ERROR_TIMEOUT) { 
      view.stopLoading(); // may not be needed 
      view.loadData(timeoutMessageHtml, "text/html", "utf-8"); 
     } 
    } 
}); 
+0

मैंने आपके द्वारा उल्लिखित त्रुटियों पर एक नज़र डाली और उन्हें संबोधित करने के लिए मेरा जवाब अपडेट किया। एंड्रॉइड प्रोजेक्ट के साथ बहुत दूर जाने से पहले आप जावा से अधिक परिचित होना चाह सकते हैं। इन छोटी त्रुटियों को डीबग करने और समस्याओं को हल करने की कोशिश करते समय एक अच्छी जावा नींव बेहद मददगार होगी। अगर आपको इसके साथ कोई अन्य समस्या आती है तो मुझे बताएं। – Brian

+2

ब्रायन, कोड को देखने के लिए धन्यवाद, मैं आपकी सहायता की सराहना करता हूं। मैंने "onReceivedError" कोड का उपयोग करके और "टाइमआउट मैसेज एचटीएमएल" स्ट्रिंग को लोड करने के बजाय समाप्त किया, मेरे पास एक नया रैखिक लेआउट है जिसे मैंने बनाया है जिसमें कस्टम त्रुटि संदेश है "setContentView()" है। इसके अलावा, आप एक अच्छी जावा नींव रखने के बारे में 100% सही हैं। मैंने कुछ जावा पुस्तकें पढ़ी हैं और मैं वर्तमान में जावा क्लास ले रहा हूं, हालांकि मैं कर कर सबसे अच्छा सीखता हूं, इसलिए मुझे लगता है कि ऐप बनाने से जावा सीखने का बेहतर तरीका क्या है। फिर से Thx। –

+1

मुझे सहायता की खुशी है और आपको खुशी है कि आप इसे काम कर रहे हैं! – Brian

10

मार्को डब्ल्यू सही है।

myWebView.setWebViewClient(new WebViewClient() { 
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
     myWebView.loadUrl("file:///android_asset/custom_url_error.htm"); 

    } 
}); 
+12

यह अधिकांश उपकरणों पर अच्छा नहीं लगेगा। मानक त्रुटि पृष्ठ को कॉल करने से पहले प्रस्तुत किया जाता है RereivedError()। परिणामस्वरूप, मानक त्रुटि पृष्ठ है कस्टम पेज लोड होने तक कुछ मिलीसेकंड के लिए दृश्यमान। – Robert

0

मैंने उपरोक्त सभी समाधानों का उपयोग करने का प्रयास किया है, लेकिन उनमें से कोई भी काम नहीं कर रहा है। मेरे कोड को थोड़ा बढ़ा दिया और समाधान मिला:

package com.samnjor.tipsmaster; 

import android.content.Context; import android.graphics.Bitmap; 
import android.net.ConnectivityManager; import 
android.net.NetworkInfo; import 
android.support.v7.app.AppCompatActivity; import android.os.Bundle; 
import android.view.View; import android.webkit.WebSettings; import 
android.webkit.WebView; import android.webkit.WebViewClient; import 
android.widget.ProgressBar; import android.widget.TextView; 

import com.google.android.gms.ads.AdListener; import 
com.google.android.gms.ads.AdRequest; import 
com.google.android.gms.ads.InterstitialAd; 

public class TodayTips extends AppCompatActivity { 
    String ShowOrHideWebViewInitialUse = "show"; 
    private WebView webview ; 
    private ProgressBar spinner; 
    private String TAG = TodayTips.class.getSimpleName(); 
    InterstitialAd mInterstitialAd; 
    final String noconnectionHtml = "Failed to connect ot the internet"; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_today_tips); 
     mInterstitialAd = new InterstitialAd(this); 

     // set the ad unit ID 
     mInterstitialAd.setAdUnitId(getString(R.string.adbig)); 

     AdRequest adRequest = new AdRequest.Builder() 
       .build(); 

     // Load ads into Interstitial Ads 
     mInterstitialAd.loadAd(adRequest); 

     mInterstitialAd.setAdListener(new AdListener() { 
      public void onAdLoaded() { 
       showInterstitial(); 
      } 
     }); 
    } 

    private void showInterstitial() { 
     if (mInterstitialAd.isLoaded()) { 
      mInterstitialAd.show(); 
     } 

     webview =(WebView)findViewById(R.id.webView); 
     spinner = (ProgressBar)findViewById(R.id.progressBar1); 
     webview.setWebViewClient(new CustomWebViewClient()); 

     webview.getSettings().setJavaScriptEnabled(true); 
     webview.getSettings().setDomStorageEnabled(true); 
     webview.setOverScrollMode(WebView.OVER_SCROLL_NEVER); 

     if(haveNetworkConnection()){ 
      webview.loadUrl("http://you domain here"); 
     } else { 


      webview.loadData(noconnectionHtml, "text/html", "utf-8"); // 
     } 
    } 
    private boolean haveNetworkConnection() { 
     boolean haveConnectedWifi = false; 
     boolean haveConnectedMobile = false; 

     ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo[] netInfo = cm.getAllNetworkInfo(); 

     for (NetworkInfo ni : netInfo) { 
      if (ni.getTypeName().equalsIgnoreCase("WIFI")) 
       if (ni.isConnected()) 
        haveConnectedWifi = true; 
      if (ni.getTypeName().equalsIgnoreCase("MOBILE")) 
       if (ni.isConnected()) 
        haveConnectedMobile = true; 
     } 
     return haveConnectedWifi || haveConnectedMobile; 

    } 

    // This allows for a splash screen 
    // (and hide elements once the page loads) 
    private class CustomWebViewClient extends WebViewClient { 

     @Override 
     public void onPageStarted(WebView webview, String url, Bitmap favicon) { 

      // only make it invisible the FIRST time the app is run 
      if (ShowOrHideWebViewInitialUse.equals("show")) { 
       webview.setVisibility(webview.INVISIBLE); 
      } 
     } 

     @Override 
     public void onPageFinished(WebView view, String url) { 

      ShowOrHideWebViewInitialUse = "hide"; 
      spinner.setVisibility(View.GONE); 

      view.setVisibility(webview.VISIBLE); 
      super.onPageFinished(view, url); 

     } 
    }`` } 
संबंधित मुद्दे