Comment changer la police de caractères de Webview dans Android?

Je veux changer la police par défaut de webview en une police personnalisée. J’utilise Webview pour développer une application de navigateur bilingue pour Android.

J’ai essayé d’obtenir une instance de police personnalisée en plaçant ma police personnalisée dans des actifs. Mais toujours pas pu définir la police par défaut de Webview à ma police.

C’est ce que j’ai essayé:

Typeface font = Typeface.createFromAsset(getAssets(), "myfont.ttf"); private WebView webview; WebSettings webSettings = webView.getSettings(); webSettings.setFixedFontFamily(font); 

Quelqu’un peut-il corriger cela ou suggérer une autre méthode pour changer la police par défaut de webview en une police personnalisée?

Merci!

Il y a un exemple concret de ceci dans ce projet . Cela se résume à:

  1. Dans votre dossier assets/fonts , placez la police OTF ou TTF souhaitée (ici MyFont.otf)
  2. Créez un fichier HTML que vous utiliserez pour le contenu de WebView, dans le dossier assets (ici, dans assets/demo/my_page.html ):

          Your text can go here! Your text can go here! Your text can go here!   
  3. Chargez le code HTML dans WebView à partir du code:

     webview.loadUrl("file:///android_asset/demo/my_page.html"); 

Notez que l’injection du code HTML via loadData() n’est pas autorisée. Selon la documentation :

Notez que la politique de même origine de JavaScript signifie que le script exécuté sur une page chargée à l’aide de cette méthode ne pourra pas accéder au contenu chargé en utilisant un schéma autre que «données», y compris «http (s)». Pour éviter cette ressortingction, utilisez loadDataWithBaseURL () avec une URL de base appropriée.

Comme le suggère @JaakL dans le commentaire ci-dessous, pour charger du HTML à partir d’une chaîne, vous devez plutôt fournir l’URL de base pointant vers vos ressources:

 webView.loadDataWithBaseURL("file:///android_asset/", htmlData); 

Lorsque vous référencez la police dans htmlData , vous pouvez simplement utiliser /fonts/MyFont.otf (en omettant l’URL de base).

J’utilise ce code :

 wv = (WebView) findViewById(R.id.webView1); Ssortingng pish = ""; Ssortingng pas = ""; Ssortingng myHtmlSsortingng = pish + YourTxext + pas; wv.loadDataWithBaseURL(null,myHtmlSsortingng, "text/html", "UTF-8", null); 

Encore plus simple, vous pouvez utiliser le format URL d’actif pour référencer la police. Aucune programmation nécessaire!

 @font-face { font-family: 'myface'; src: url('file:///android_asset/fonts/myfont.ttf'); } body { font-family: 'myface', serif; 

Cela peut se faire sous Android. J’ai pris trois jours pour résoudre ce problème. Mais maintenant, cela semble très facile. Suivez ces étapes pour définir une police personnalisée pour Webview

1.Ajoutez votre police au dossier de ressources
2.Copiez la police dans le répertoire des fichiers de l’application

 private boolean copyFile(Context context,Ssortingng fileName) { boolean status = false; try { FileOutputStream out = context.openFileOutput(fileName, Context.MODE_PRIVATE); InputStream in = context.getAssets().open(fileName); // Transfer bytes from the input file to the output file byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } // Close the streams out.close(); in.close(); status = true; } catch (Exception e) { System.out.println("Exception in copyFile:: "+e.getMessage()); status = false; } System.out.println("copyFile Status:: "+status); return status; } 

3.Vous devez appeler la fonction ci-dessus une seule fois (vous devez trouver une logique pour cela).

 copyFile(getContext(), "myfont.ttf"); 

4.Utilisez le code ci-dessous pour définir la valeur de votre vue Web. Ici, j’utilise CSS pour définir la police.

 private Ssortingng getHtmlData(Context context, Ssortingng data){ Ssortingng head = ""; Ssortingng htmlData= ""+head+""+data+"" ; return htmlData; } 

5.Vous pouvez appeler la fonction ci-dessus comme ci-dessous

 webview.loadDataWithBaseURL(null, getHtmlData(activity,htmlData) , "text/html", "utf-8", "about:blank"); 

Je l’ai fait par réponses supérieures avec ces ajouts:

 webView.loadDataWithBaseURL("file:///android_asset/", WebClient.getStyledFont(someText), "text/html; charset=UTF-8", null, "about:blank"); 

puis utilisez src: url("file:///android_asset/fonts/YourFont...

 public static Ssortingng getStyledFont(Ssortingng html) { boolean addBodyStart = !html.toLowerCase().contains(""); boolean addBodyEnd = !html.toLowerCase().contains("@font-face {font-family: CustomFont;" + "src: url(\"file:///android_asset/fonts/Brandon_reg.otf\")}" + "body {font-family: CustomFont;font-size: medium;text-align: justify;}" + (addBodyStart ? "" : "") + html + (addBodyEnd ? "" : ""); } 

Merci à tout le monde:)

Bon nombre des réponses ci-dessus fonctionnent bien si vous avez votre contenu dans votre dossier de ressources.

Toutefois, si vous souhaitez, comme moi, télécharger et enregistrer tous vos actifs depuis un serveur vers votre stockage interne, vous pouvez utiliser loadDataWithBaseURL et utiliser une référence à votre stockage interne en tant que baseUrl. Ensuite, tous les fichiers seront relatifs au HTML chargé et sont trouvés et utilisés correctement.

Dans mon stockage interne, j’ai enregistré les fichiers suivants:

Ensuite, j’utilise le code suivant:

 WebView web = (WebView)findViewById(R.id.webby); //For avoiding a weird error message web.setLayerType(View.LAYER_TYPE_SOFTWARE, null); Ssortingng webContent = "" + "
I am a text rendered with INDIGO
"; Ssortingng internalFilePath = "file://" + getFilesDir().getAbsolutePath() + "/"; web.loadDataWithBaseURL(internalFilePath, webContent, "text/html", "UTF-8", "");

Le fichier CSS utilisé dans le fichier HTML ci-dessus (style.css):

 @font-face { font-family: 'MyCustomRunning'; src: url('IndigoAntiqua2Text-Regular.ttf') format('truetype'); } .running{ color: #565656; font-family: "MyCustomRunning"; font-size: 48px; } 

Je l’ai seulement essayé en ciblant minSdkVersion 19 (4.4) alors je n’ai aucune idée si cela fonctionne sur d’autres versions

Vous pouvez le faire en utilisant CSS. Je l’ai fait avec une application mais cela ne fonctionnera pas dans Android 2.1, car il existe un bogue connu avec le navigateur Android 2.1.

Le problème est qu’il doit être dans un dossier, essayez de mettre “./myfont.ttf” à la place, sinon mettez la police dans un dossier dans des ressources comme “fonts / myfont.ttf” qui fonctionnera à coup sûr.

  webview= (WebView) findViewById(R.id.webview); Ssortingng myCustomStyleSsortingng=""; webview.loadDataWithBaseURL("", myCustomStyleSsortingng+"
"+intentpost.getSsortingngExtra("content")+"
", "text/html", "utf-8", null);

Voici comment vous chargez htmlData dans une vue Web:

 webview.loadDataWithBaseURL(null, getHtmlData(activity,**htmlData**) , "text/html", "utf-8", "about:blank"); 

getHtmlData(activity,**htmlData**) renvoie une chaîne de code HTML.