2011-12-20 7 views
10

मैं विकसित करने के लिए कोशिश कर रहा हूँ के लिए नहीं बुलाया एक custom browserWebView उपयोग करने के साथ एंड्रॉयड API level 10 (SDK 2.3.3), दुर्भाग्य से मैं कैसे webpage से अनुरोध रोकना नहीं जानते नई ब्राउज़र विंडो में खुले यूआरएल, जैसे target="_blank" के साथ लिंक पर टैप।WebView + WebChromeClient विधि onCreateWindow target = "_ blank"

API Doc के अनुरूप होने पर मैंने WebChromeClient पर ओवरराइड किया है, लेकिन इस तरह के लिंक को टैप करने पर कॉल नहीं किया जाता है। इस एपीआई स्तर की एक बग हो सकता है? WebView से बचने वाले ब्राउज़र में आने वाले लिंक खोलने से बचने के लिए मैं shouldOverrideUrlLoading को ओवरराइड कर रहा हूं।

मेरा नमूना कोड है जो google.com खुलता है। इसका परीक्षण करने के लिए, "समाचार" टैप करें और फिर किसी भी समाचार शीर्षक पर टैप करें। एंड्रॉइड अंतर्निर्मित ब्राउज़र सामान्य रूप से इसे नए browser window में खुलता है।

package com.myexample; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Message; 
import android.util.Log; 
import android.webkit.WebChromeClient; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.widget.Toast; 

public class HelloAndroidActivity extends Activity { 

    private static String TAG = "WebViewTest"; 
    private WebView mWebView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Log.i(TAG, "onCreate"); 
    setContentView(R.layout.main); 

    mWebView = (WebView) findViewById(R.id.mywebview); 

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

    mWebView.setWebChromeClient(new WebChromeClient() { 
     @Override 
     public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, Message resultMsg) { 
     Toast.makeText(getApplicationContext(), "OnCreateWindow", Toast.LENGTH_LONG).show(); 
     return true; 
     } 
    }); 
    mWebView.loadUrl("http://www.google.com"); 
    } 

} 

+0

Lotzy, onCreateWindow कहा जाता हो जाएगा केवल यदि आप shouldOverrideUrlLoading से सच लौट आते हैं। एक वेब व्यू बग लगता है, क्योंकि ज्यादातर मामलों में आप shouldOverride से झूठी वापसी नहीं कर सकते हैं ... – myself

+0

ठीक है, जैसा कि आप देख सकते हैं कि एक वापसी सही है; चाहिएOverrideUrlLoading विधि में। – Lotzy

उत्तर

5

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

यह जावास्क्रिप्ट कोड लोड किए गए पृष्ठ पर सभी लिंक टैग प्राप्त करता है और विश्लेषण करता है कि लक्ष्य = "_ खाली" के साथ कोई विशेषता है या नहीं। इनमें से प्रत्येक लिंक href विशेषता के यूआरएल मान के सामने "newtab:" जोड़ देगा। फिर mustOverrideUrlLoading() विधि में मैं जांचता हूं कि क्या url "newtab:" स्ट्रिंग से शुरू होता है, इस स्थिति में मैं एक नया टैब खोलता हूं।

यहाँ कोड snipets हैं:

mWebView.setWebViewClient(new WebViewClient() {

@Override 
    public void onPageFinished(WebView view, String url) { 
     view.loadUrl("javascript: var allLinks = document.getElementsByTagName('a'); if (allLinks) {var i;for (i=0; i<allLinks.length; i++) {var link = allLinks[i];var target = link.getAttribute('target'); if (target && target == '_blank') {link.setAttribute('target','_self');link.href = 'newtab:'+link.href;}}}"); 
    } 



    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String urls) { 
     if (urls.startsWith("newtab:")) { 
      addTab(); //add a new tab or window 
      loadNewURL(urls.substring(7)); //strip "newtab:" and load url in the webview of the newly created tab or window 
     } 
     else { 
      view.loadUrl(urls); //load url in current WebView 
     } 
     return true; 
    } 
} 

+1

अभी तक बहुत परीक्षण नहीं किया गया है, लेकिन अभी तक बहुत अच्छी तरह से काम करता है :) बहुत बहुत धन्यवाद! – myself

6

आप इस पर एक नज़र लेने की जरूरत:

webView.getSettings().setSupportMultipleWindows(true); 

फिर onCreateWindow कहा जाता हो जाएगा।

+0

दोस्तों, क्या आप वाकई एपीआई स्तर 10 (एसडीके 2.3.3) के साथ अपने कोड की कोशिश की है? – Lotzy

+0

यह उत्तर मेरे लिए उपयोगी था :-) –

23

सुनिश्चित करें कि आप समर्थन के लिए समर्थन MultipeWindows सेट करें। इसके बिना WebChromeClient के क्रिएटविंडो को कभी भी कॉल नहीं किया जाएगा।

WebSettings settings = webView.getSettings(); 
settings.setSupportMultipleWindows(true); 

फिर एक WebChromeClient रजिस्टर और ओवरराइड onCreateWindow

webView.setWebChromeClient(new WebChromeClient() { 
     @Override public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, Message resultMsg) 
     { 
      WebView newWebView = new WebView(getContext()); 
      addView(newWebView); 
      WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj; 
      transport.setWebView(newWebView); 
      resultMsg.sendToTarget(); 
      return true; 
     } 
    }); 
+0

कूल मेरे लिए काम किया :) – Akshat

+0

मेरे लिए यह काम नहीं कर रहा है, कि क्रिएटविंडो() विधि से टोस्ट नहीं दिखाया गया है। मैंने उस लाइन में ब्रेकपॉइंट भी लगाया और डीबगर के साथ ऐप लॉन्च किया लेकिन निष्पादन उस लाइन में नहीं रुकता है। – Lotzy

+0

बहुत बढ़िया, अंत में इसके साथ काम करता है! एक प्रश्न पूछें, क्यों "addView (newWebView)"? मुझे यह लाइन नहीं मिलती है। और मैं इसका भी उपयोग नहीं करता हूं। क्या आप इस लाइन के बिंदु को समझा सकते हैं? thx – Seynorth