Injecter une CSS ou du Javascript dans une WebView Android

FFFFFUUUUU… je viens de chercher, j’ai trouvé, c’est tout con et je suis déjà passé par là.

Pour injecter une feuille de style sous Android j’ai pas trouvé d’autre moyen que de passer par l’utilisation d’une redirection par un lien en « javascript: », chose que j’utilisais déjà sur mon extension Chrome pour contrôler le player Deezer. C’est sale mais ça a l’avantage de plutôt bien fonctionner.

Donc il suffit de définir un chargement d’URL après le chargement de la page. De cette façon on peut ajouter le Javascript ou le CSS de son choix au document. Par exemple si votre WebView affiche une seule WebApp sans la possibilité d’en sortir ça permettra d’éviter le chargement de ces ressources, de gagner du temps, du trafic (côté client comme serveur) et d’avoir un utilisateur un peu plus heureux.

Le code est le suivant :

// Indispensable, sinon Javascript ne fonctionne pas dans notre webview
webview.getSettings().setJavaScriptEnabled(true);
webview.setWebViewClient(new iManagerWebViewClientServices() {
	// On remplace l'action par défaut (qui est... vide) et on charge notre CSS
	@Override
	public void onPageFinished(WebView view, String url) {
		view.loadUrl("javascript:"
		+ "var styles = document.createElement('STYLE'); "
		+ "styles.innerHTML = '" + getResources().getString(R.string.web_view_styles) + "';"
		+ "document.body.appendChild(styles)");
	}
});

Le code est mis dans la chaîne web_view_style pour être plus facile à éditer. Le innerHTML n’est pas non plus des plus beaux mais ça évite des heures de prise de tête avec le support CSS de Javascript. Petit détail, le caractère ‘ doit être banni de votre feuille de style vu qu’il la délimite.

This entry was posted in Développement. Bookmark the permalink.

One Response to Injecter une CSS ou du Javascript dans une WebView Android

  1. doRian07S says:

    Bonjour,
    Ton post est un peu vieux mais je tente ma chance.
    Je charge une page web dans une webview et j’aimerai modifier le css pour l’adapter à l’écran. Sachant que je ne suis pas propriétaire de la page que je charge, comment modifier ce css ?

    Voila ce que j’ai fait mais le code n’est pas injecter :

    public void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
    setContentView(R.layout.main);
    WebView webView = (WebView) findViewById(R.id.webview);
    webView.getSettings().setJavaScriptEnabled(true);

    webView.setWebChromeClient(new WebChromeClient() {
    public void onProgressChanged(WebView view, int progress)
    {
    activity.setTitle(« Loading… »);
    activity.setProgress(progress * 100);

    if(progress == 100)
    activity.setTitle(R.string.app_name);
    }
    });

    webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
    {
    // Handle the error
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url)
    {
    view.loadUrl(url);
    return true;
    }
    });
    //Pour le changement de css
    final String css = « #header { display:none; } »;
    webView.getSettings().setJavaScriptEnabled(true);
    webView.setWebChromeClient(new WebChromeClient() {
    // On remplace l’action par défaut (qui est… vide) et on charge notre CSS
    public void onPageFinished(WebView view, String url) {
    view.loadUrl(« javascript: »
    + « var styles = document.createElement(‘STYLE’);  »
    + « styles.innerHTML = ‘ »+ css + »‘; »
    + « document.body.appendChild(styles) »);
    }
    });
    //fin d’ajout
    webView.loadUrl(« http://monsite.com »);
    }
    Merci d’avance ;)

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>