WebView + WebChromeClient méthode onCreateWindow non appelée pour target = "_ blank"
Je suis en train de développer un custom browser
avec WebView
utilisant Android API level 10
(sdk 2.3.3), malheureusement, je ne sais pas comment faire pour intercepter la demande de la webpage
pour ouvrir l'URL dans une nouvelle fenêtre de navigateur, tels les robinets sur les liens avec target="_blank"
.
En conformité avec les API Doc
j'ai annulé la onCreateWindow
de WebChromeClient
mais n'est pas appelée lorsqu'un tel lien est exploité. Pourrait être un bug de cette API? Je suis également primordial shouldOverrideUrlLoading
pour éviter WebView
ouverture ultérieure des liens dans le navigateur intégré.
Voici mon exemple de code qui ouvre google.com
. Pour le tester, appuyez sur "News", puis appuyez sur n'importe quel titre de la news. Android navigateur intégré normalement s'ouvre dans une nouvelle 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");
}
}
source d'informationauteur Lotzy | 2011-12-20
Vous devez vous connecter pour publier un commentaire.
Assurez-vous de définir supportMultipeWindows de vrai. Sans elle, l'onCreateWindow de la WebChromeClient ne sera jamais appelé.
Puis enregistrer un WebChromeClient et remplacer onCreateWindow
Vous avez besoin de prendre un coup d'oeil à ceci:
Puis
onCreateWindow
sera appelée.N'a pas pu trouver d'autre solution que d'injecter du code javascript. J'ai même essayé de compiler de l'intégré dans le navigateur android code téléchargé à partir de google source de dépôt mais ne compile pas car j'ai trouvé qu'utilise certains non public de l'API. Dolphin browser utilise également son propre extented WebView donc je n'avais aucune chance de trouver comment ils mettent en ouvrir une nouvelle fenêtre de requête de détection.
Ce code javascript obtient toutes les balises link sur la page chargée et d'analyser si il y a un attribut target="_blank". Pour chacun de ces liens permettra d'ajouter "newtab:" devant l'url de la valeur de l'attribut href. Puis, dans la shouldOverrideUrlLoading() la méthode-je vérifier si l'url commence par "newtab:" chaîne de caractères, auquel cas j'ouvre un nouvel onglet.
Voici le code snipets:
mWebView.setWebViewClient(new WebViewClient() {