webview的自定义字体

时间:2013-08-03 12:23:50

标签: android fonts webview

我正在尝试为我的网络视图建立一个新的自定义字体(otf文件)。

我把anbaaarabic_bold.otf放在资产档案中。

我是怎么做的:

String head = "<head><style>@font-face {font-family: 'verdana';src: url('file://"+ getActivity().getFilesDir().getAbsolutePath()+ "/anbaaarabic_bold.otf');}body {font-family: 'verdana';}</style></head>";
String htmlData= "<html>"+head+"<body style=\"font-family: verdana\">"+body+"</body></html>" ;

mBodyArticle.loadDataWithBaseURL("http://nada", htmlData,
                    "text/html", "utf-8", "");

正文:包含我的HTML代码。

我不知道为什么字体不能用于我的webview。 body html字体不会改变。

6 个答案:

答案 0 :(得分:10)

Android上有bug report似乎表明自定义字体不适用于某些语言(已提及泰语,希伯来语,波斯语和阿拉伯语)。谷歌的任何人都没有证实这一点,但有很多人报告了同样的问题。

其中一个建议的解决方案(至少有一个用户确认工作)是将字体从otf转换为svg。有许多在线工具会为您执行此操作(Everything Fonts就是一个示例),但您可能会遇到受版权保护的字体问题 - 请确保您的字体许可证允许此类转换。

此外,转换字体后,在文本编辑器中打开它并检查svg元素是否为命名空间。看起来应该是这样的:

<svg xmlns="http://www.w3.org/2000/svg">

如果只有<svg>没有命名空间,则可能需要手动添加xmlns属性。显然,没有命名空间的svg字体也不起作用。

答案 1 :(得分:4)

要获取放置在/assets文件夹中的文件的URI,您需要使用:

file:///android_asset/file_name

请尝试以下代码:

String head = "<head><style>@font-face {font-family: 'verdana';src: url('file:///android_asset/anbaaarabic_bold.otf');}body {font-family: 'verdana';}</style></head>";
String htmlData= "<html>"+head+"<body style=\"font-family: verdana\">"+body+"</body></html>" ;

mBodyArticle.loadDataWithBaseURL("http://nada", htmlData,
                "text/html", "utf-8", "");

确保使用确切的文件名(区分大小写)。

答案 2 :(得分:2)

您的手机是否有机会运行Android 2.1?

2.1中有known bug。因此,自定义字体不适用于2.1。但这应该适用于1.5,1.6和2.2。

您可以找到更多信息here

答案 3 :(得分:2)

这是如何使用html为webview设置字体的示例。在此视图中,在HTML String中设置字体并使用webview加载。将字体放在assests文件夹中。

enter image description here

每个拥有默认字体的Android设备。使用字体都需要让您的应用程序外观和感觉良好。点击此处了解有关字体的更多信息

步骤:1创建一个新的Android应用程序项目并将这些代码复制到xml文件中 activity_main.xml:]

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <WebView
        android:id="@+id/webViewFace"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

步骤:2 在src文件夹中创建一个MainActivity.java并复制这些代码

package com.androidtoppers.typeface;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends Activity {

 WebView mWebView;


 String htmlstr1="<p style='text-align:right'><H2>Android Toppers</H2></p> <p style='text-align:left'>It is safer to use a JSON parser to convert a JSON text to a JavaScript object.</p>";
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activtiy_main);

  mWebView = (WebView) findViewById(R.id.webViewFace);
  mWebView.setWebViewClient(new WebViewClient() {

   @Override
   public boolean shouldOverrideUrlLoading(WebView view, String url) {
    // TODO Auto-generated method stub
    view.loadUrl(url);
    return true;
   }
  });
   String head1 = "<head><style>@font-face {font-family: 'arial';src: url('file:///android_asset/fonts/bichkam.ttf');}body {font-family: 'verdana';}</style></head>";
   String text="<html>"+head1
     + "<body style=\"font-family: arial\">" + htmlstr1
     + "</body></html>";

   mWebView.loadDataWithBaseURL("", text, "text/html", "utf-8", "");

 }

}

有关详细信息,请参阅此链接:http://velmuruganandroidcoding.blogspot.in/2014/08/set-typeface-for-webview-in-android.html

答案 4 :(得分:0)

试试此链接

 <title>example</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

 <style type="text/css">@font-face {font-family: MyCustomFont; src: 

url(file:///android_asset/Bamini.otf)}body {font-family: MyCustomFont, Verdana, Arial, 

sans-serif; font-size: medium; color: black}</head><body>

<h1>tamilStringEncoded </h1></body></html>

答案 5 :(得分:-1)

我猜getActivity().getFilesDir().getAbsolutePath()没有让你进入你的字体所在的资源文件夹,所以字体的更改只是被忽略,因为它找不到 当我使用自定义字体时,我使用路径this.getAssets() + "your_font_name.otf"

我使用的代码:

Typeface type = Typeface.createFromAsset(this.getAssets(), fontName);
((TextView) findViewById(R.id.textView1)).setTypeface(type);