如何将自定义字体嵌入Android应用程序(WebView)

3
我想将自定义字体嵌入我的Android应用程序中。我不使用TextView,因此像这样的教程(如何在TextView中使用自定义字体)对我没有帮助。
在我的情况下,内容来自SQLite数据库,并使用WebView在屏幕上显示。我也不使用打包的HTML文件,所以这个教程(如何在WebView中使用自定义字体)也无法解决我的问题。
顺便说一下,这是我的代码:
public void initWebview()
{
    WebSettings settings = wvContent.getSettings();
    settings.setDefaultTextEncodingName("utf-8");
    setContentView(R.layout.content);
    wvContent = (WebView) findViewById(R.id.wvContent);
    wvContent.setBackgroundColor(Color.argb(250, 250, 250, 250));
    wvContent.getSettings().setSupportZoom(true);  
    wvContent.getSettings().setBuiltInZoomControls(true);       
    wvContent.setInitialScale(100); 
    wvContent.setWebViewClient(new WebViewClient()

    {
        public void onPageFinished(WebView view, String url)
        {
            if (pd != null)
            {
                pd.dismiss();
                pd = null;
            }
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url)
        {
            Log.i(CONTENT_TAG,"WebView link clicked; url = " + url);
            try
            {
                String arrUrlPart[] = url.split("://");

                if (arrUrlPart[0].equals("entry"))
                {
                    String content = getContentByWord(arrUrlPart[1]);
                    showContent(content);
                }
                else if (arrUrlPart[0].equals("http"))
                {
                     try {                             
                         startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));                              
                     } catch (Exception ex) {
                         // TODO Auto-generated catch block
                         ex.printStackTrace();
                     }                      
                }
            }
            catch (Exception ex)
            {
                ex.printStackTrace();
            }
            return true;
        }
    });
}

存储在assets/fonts中的字体似乎被嵌入到应用程序中,我的问题是:

  1. 我如何以编程方式“强制”我的应用程序使用这种字体?
  2. 是否有任何解决方案可以解决我的问题?

非常感谢。


一些指导在这里:https://dev59.com/mms05IYBdhLWcg3wAdWT - Seva Alekseyev
谢谢,但不是我的情况。 - Niamh Doyle
2个回答

9

这个回答的评论中,可能的解决方案似乎是使用loadDataWithBaseURL,同时将资产文件夹作为基本url提供,即

LoadData()无法工作,但是webView.loadDataWithBaseURL(“file:///android_asset/”,...可以很好地工作。然后,“/fonts/MyFont.otf”作为字体文件引用也应该可以工作。 - JaakL Dec 1'11 at 16:59

我假设打包你的字体不是问题,对吗?

[编辑]为了澄清我的答案,我编写了一个小例子。在下面的代码中,我将Quicksand_Dash.otf放在assets/fonts中,并且直接将twitter_logo.png放入assets中。 HTML只是一个字符串常量,但您可以从SQLLite数据库检索它。实质上就是使用loadDataWithBaseURL()....

package oh.jolly.webview;

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;

public class WebviewTestActivity extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        WebView webView = (WebView) findViewById(R.id.webview);
        webView.loadDataWithBaseURL("file:///android_asset/", PAGE_HTML, "text/html", "UTF-8", "null" );
    }

    private final static String PAGE_HTML =
        "<html>\n" +
        "  <style type=\"text/css\"> \n" + 
        "   @font-face { \n" + 
        "       font-family: MyFont; \n" + 
        "       src: url(\"file:///android_asset/fonts/Quicksand_Dash.otf\") \n" + 
        "   } \n" + 
        "   body { \n" + 
        "       font-family: MyFont; \n" + 
        "       font-size: medium; \n" + 
        "       text-align: justify; \n" + 
        "   } \n" + 
        "  </style> \n" + 
        "  <body>\n" + 
        "    I've got a sinking feeling...<br>\n" + 
        "    <img src=\"file:///android_asset/twitter_logo.png\" />\n" + 
        "  </body>\n" + 
        "</html>";


}

我不确定我是否理解了你的观点,但是我已经尝试过这个教程,并且它只在需要嵌入字体的文本字符串位于存储在assets中的HTML文件的<body>...</body>之间时才起作用。然而,在我的情况下,数据来自SQLite数据库。谢谢。 - Niamh Doyle
是的。这就是为什么我(以及引用的评论)建议您使用loadDataWithBaseURL(而不是该教程中的loadURL)。您仍然提供字体的资产网址,但HTML来自SQL数据库。 - Paul-Jan
非常感谢,保罗。但是我无法将你的示例适应到我的代码中。我猜测在我的程序中存在一些不兼容的问题。这就是为什么它总是在Eclipse中显示未解决的错误。我现在还在努力尝试。 - Niamh Doyle
最终,我设法让它运行了,但结果并不如我所预期。我的应用程序从其SQLite数据库中未加载内容,而只是一句话“我有一种沉重的感觉...”和一个标志。 - Niamh Doyle
是的,loadDataWithBaseURL(“file:///android_asset/”)就是解决方案。非常感谢。 - hobbs
1
你救了我的命啊 :p +9999 - haythem souissi

0

非常感谢,我之前尝试过那些方法,但是正如我所说,我没有使用捆绑的HTML文件,所以它们并没有帮助到我。 - Niamh Doyle
您正在运行时生成包含HTML正文和SQLite内容的字符串...无需创建HTML文件。 - SBJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接