2014-04-25 10 views
14

वहाँ HTML फ़ाइल में लिंक के दो प्रकार हैं के लिए नहीं कहा:WebView shouldOverrideUrlLoading() अमान्य लिंक

(1) A normal link like http://www.bbb.com/q?type=normal 
(2) A short link like /q?type=short. 

पहली तरह के लिए, बस यूआरएल लोड। दूसरी तरह के लिए, मुझे यूआरएल लोड करने से पहले http://www.abc.com जैसे एक निश्चित पते के साथ इसे पूर्ववत करना चाहिए।

मैं WebViewClient में चाहिएOverrideUrlLoading() फ़ंक्शन को ओवरराइड करने के साथ ऐसा करने का प्रयास कर रहा हूं। हालांकि इस समारोह को दूसरे प्रकार के लिंक के लिए बुलाया नहीं जाता है। मैंने HTML फ़ाइल में दूसरे प्रकार के लिंक पर "http://www.abc.com" को पूर्ववत करने का प्रयास किया। फिर जब मैं दूसरे प्रकार के लिंक पर क्लिक करता हूं तो फ़ंक्शन कॉल किया जाता है।

मुझे लगता है कि क्या हो रहा है वेबव्यू पहले जांच करेगा कि लिंक मान्य यूआरएल है या नहीं। केवल तभी वैध होगा जब कार्य को बुलाया जाएगा। क्या मैं सही हू? इसे कैसे हल किया जा सकता है? अग्रिम में धन्यवाद।

 contentWebView = new WebView(context); 

     webViewClient = new WebViewClient() { 
      @Override 
      public void onPageStarted(WebView view, String url, Bitmap favicon) { 
       super.onPageStarted(view, url, favicon); 
      } 

      @Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url) { 
       // String not in Logger. 
       Log.d(TAG, "Here!"); 
       Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
       context.startActivity(intent); 
       return true; 
      } 

      @Override 
      public void onPageFinished(WebView view, String url) { 
       super.onPageFinished(view, url); 
       if (hosted) { 
        contentWebView.setVisibility(VISIBLE); 
       } else { 
        summaryTextView.setVisibility(VISIBLE); 
        articleLinkButton.setVisibility(VISIBLE); 
       } 

       progressBar.setVisibility(View.GONE); 
      } 
     }; 

     contentWebView.setWebViewClient(webViewClient); 
     contentWebView.getSettings().setJavaScriptEnabled(true); 
     contentWebView.loadData(fullString, "text/html", "utf-8"); 
     contentWebView.setVisibility(GONE); 

अधिक इस पर:

मैं

contentWebView.loadDataWithBaseURL("http://www.abc.com", fullString, "text/html", "utf-8", null); 

तब समारोह कहा जाता हो जाता है करने के लिए

contentWebView.loadData(fullString, "text/html", "utf-8"); 

बदलते कोशिश की।

यदि मैं मैन्युअल रूप से HTML स्ट्रिंग में एक पूर्ण लिंक के लिए छोटा लिंक बदलता हूं। फिर समारोह भी बुलाया जाता है।

तो मुझे लगता है कि यह संभवतः हो रहा है: WebView जांचता है कि लिंक यूआरएल वैध है या नहीं। केवल जब यूआरएल मान्य होगा तो चाहिए ओवरराइडउर्ल लोडिंग() को कॉल किया जाना चाहिए।

+0

क्या आप हमें अपने कंधे ओवरराइडउर्ल लोडिंग() कार्यान्वयन का कुछ कोड दिखा सकते हैं? – shkschneider

+0

@shkschneider कोड जोड़ा गया। लेकिन समस्या यह है कि अगर यूआरएल वैध नहीं है तो फ़ंक्शन को कॉल नहीं किया जा रहा है। – darklord

+0

आपके संपादन के बाद नोट: हाँ, यह वही होता है जो वास्तव में होता है। बेसयूआरएल – shkschneider

उत्तर

12

आप शायद किटकैट WebView का उपयोग कर रहे उपयोग करके देखें। यह एक ज्ञात मुद्दा है (मुझे लगता है कि यह माइग्रेशन गाइड में उल्लिखित है) जहां यूआरएल को बेस यूआरएल के खिलाफ हल नहीं किया जा सकता है, उन्हें फर्श पर गिरा दिया जाता है (आपको उनके लिए कोई कॉलबैक नहीं मिलेगा, न ही ओवरराइड यूआरएल लोडिंग और न ही पेज स्टार्ट किया जाना चाहिए)।

समस्या यह है कि आपका बेस यूआरएल एक डेटा यूआरएल है, इसलिए आप '/ q? Type = short' को 'डेटा: टेक्स्ट/एचटीएमएल, ...' के खिलाफ हल करने का प्रयास कर रहे हैं, जो ज्यादा समझ में नहीं आता और इसलिए यूआरएल पर नेविगेट करने का पूरा प्रयास अनदेखा हो जाता है।

यह पूर्व-केके वेबव्यू के लिए अलग था जो यूआरएल प्रोसेसिंग के लिए गुर्ल के बजाय कर्ल का इस्तेमाल करता था। गुर्ल आमतौर पर कर्ल की तुलना में अधिक सख्त (और अधिक सुरक्षित) है, जो दो वेबव्यू संस्करणों के बीच कुछ असंगतता का कारण है।

+1

माइग्रेशन मार्गदर्शिका: https://developer.android.com/guide/webapps/migrating.html – Beth

4

शायद onPageStarted विधि

+1

'ऑनपेज स्टार्टेड' प्रदान करने का प्रयास करें मेरे लिए – Hadi

5

समाधान है कि मेरे लिए काम किया गलत baseurl साथ loadDataWithBaseURL उपयोग करने के लिए और पता चलता है कि और इसे हटाने और "http: //" से बदलें था setWebViewClient दौरान

public class MyActivity 
    extends Activity 
{ 
    private static final String badurl = "http://myappname.invalid/"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     ... 
     WebView wv = ((WebView)findViewById(R.id.webview)); 
     WebSettings settings = wv.getSettings(); 
     settings.setJavaScriptEnabled(false); 
     settings.setSupportMultipleWindows(true); 
     wv.setWebChromeClient(new WebChromeClient() { 
      @Override 
      public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) 
      { 
       handleUrlview.getHitTestResult().getExtra()); 
       return true; 
      } 
     }); 
     wv.setWebViewClient(new WebViewClient() { 
      @Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url) 
      { 
       handleUrl(url); 
       return true; 
      } 
     }); 
     wv.loadDataWithBaseURL(badurl,text,"text/html","utf-8",null); 
    } 

    private void handleUrl(String url) 
    { 
     if (url.startsWith(badurl)) 
      url = "http://"+url.substring(badurl.length()); 
     try { 
      startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); 
     } catch (ActivityNotFoundException e) { } 
    } 
} 
-1

इस

private static WebView webView; 
 
    @Override 
 
    protected void onCreate(Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     setContentView(R.layout.activity_main); //should be activity_main 
 

 
     webView = (WebView) findViewById(R.id.web); 
 

 
     webView.setWebViewClient(new webviewclient()); 
 
     webView.getSettings().setJavaScriptEnabled(true); 
 
     webView.loadUrl("http://www.yahoo.com"); 
 

 
    } 
 
public class webviewclient extends WebViewClient{ 
 

 
    @Override 
 
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { 
 
     view.loadUrl(request.toString()); 
 
     return true; 
 
    }

0

मैं भी इस समस्या का सामना करना पड़ा और मेरे एचटीएमएल प्रतिक्रिया को बदल कर इसे हल की कोशिश करो। मेरे एचटीएमएल प्रतिक्रिया में "href" एचटीएमएल टैग में कोई होस्ट नहीं है। फिर मैंने इसे कोड के बाद बदल दिया और यह अब एक आकर्षण की तरह काम कर रहा है :)

 String htmlString = AppCache.homePageResponse.showcaase.replace("href=\"/", "href=\"" + "evidea://"); 
संबंधित मुद्दे