使用来自res / font的自定义字体与Android中的WebView

时间:2017-09-21 13:04:23

标签: android webview fonts font-face custom-font

我想更改加载到WebView中的html字符串的字体,与此问题中提到的类似:

How to change font face of Webview in Android?

不同之处在于我没有使用旧方法将字体文件存储在assets文件夹中,但我将它们存储在res / font中,如“字体在XML中”android字体支持文档中所述:

https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html

现在,我显然不能使用:

file:///android_asset/fonts/my_font.otf

我试过了:

file:///android_res/font/my_font.otf

以及在res / font文件夹中描述我的字体路径的许多其他方法,但它们都不起作用。

如果我的字体存储在res / font文件夹中,如何为加载html字符串的WebView使用自定义字体系列?

//编辑:

我目前无效的实施方案是:

@BindingAdapter("loadData")
public static void loadData(WebView webView, String htmlData) {
    webView.loadDataWithBaseURL(null, htmlData, "text/html", "utf-8", null);
}

@BindingAdapter({"loadData", "fontFamily"})
public static void loadData(WebView webView, String htmlData, @FontRes int fontFamilyId) {
    TypedValue value = new TypedValue();
    ApplicationActivity.getSharedApplication().getResources().getValue(fontFamilyId, value, true);
    String fontPath = value.string.toString();
    File fontFile = new File(fontPath);

    String prefix = "<html>\n"
            +"\t<head>\n"
            +"\t\t<style type=\"text/css\">\n"
            +"\t\t\t@font-face {\n"
            +"\t\t\t\tfont-family: 'CustomFont';\n"
            +"\t\t\t\tsrc: url(\"file:///android_res/font/"+fontFile.getName()+"\")\n"
            +"\t\t\t}\n"
            +"\t\t\tbody {\n"
            +"\t\t\t\tfont-family: 'CustomFont';\n"
            +"\t\t\t}\n"
            +"\t\t</style>\n"
            +"\t</head>\n"
            +"\t<body>\n";
    String postfix = "\t</body>\n</html>";

    loadData(webView, prefix + htmlData + postfix);
}

3 个答案:

答案 0 :(得分:7)

刚试过,这与从资源加载字体的工作方式类似,只需要更改基本网址即可指向资源。

示例HTML

<html>
<head>
    <style>
        @font-face {
            font-family: 'CustomFont';
            src: url('font/CustomFont.ttf');
        }
        #font {
            font-family: 'CustomFont';
        }
    </style>
</head>
<body>
    <p>No Font</p>
    <br />
    <p id="font">Font</p>
</body>

使用Webview#loadDataWithBaseURL(String, String, String, String, String)将此HTML加载到网页视图中,使用file://android_res/作为基本网址(第一个参数)

示例:

webview.loadDataWithBaseURL("file:///android_res/", html, "text/html", "utf-8", null)

编辑:

如果您在发布版本中使用proguard,则需要添加额外的规则以防止在ProGuard过程中重命名R类,否则WebView将无法使用找到字体资源。详情请见this post

答案 1 :(得分:1)

您可以像这样使用自定义res字体 -

<head>
<style type="text/css">
    @font-face {
        font-family: MyFont;
        src: url("file:///res/font/myfont.ttf")
    }
    body {
        font-family: MyFont;
    }
</style>

答案 2 :(得分:1)

我设法从res/font目录加载本地字体。在我的示例中,我想加载斜体openans。

我的设置如下:

    assets目录中的
  1. css文件
  2. 使用此设置字体外观
    @font-face {
      font-family: 'opensans';
      src: url("file:///android_res/font/opensans_italic.ttf")
    }

    body {
      font-family: 'opensans';
      font-weight: 400;
    }
  1. 使用loadDataWithBaseUrl加载WebView,例如:

    webView.loadDataWithBaseURL(null, yourHtmlContent, "text/html", "utf-8", null)

    但是我在html内容的顶部有这个: "<link rel='stylesheet' type='text/css' href='file:///android_asset/mycss.css' />”

    我希望它也适用于您的情况。

编辑:

将其添加到您的proguard配置中以使其在发布模式下工作。

-keep class com.your.package.name.R$font { *; }