In one of my projects, I needed to display some special characters that the Android OS by itself cannot seem to render. I figured that I would need to provide a custom font that includes the characters that I needed.

If I was using a TextView, I could use TextView#setTypeFace. But I was using a WebView and I feared that things would be more complicated than that. So how do I do this?

Here’s how we can make it work.

Step 1: We would need to have our font face included in our project’s /assets folder. So look for a TTF file that you can use freely, make sure the author/creator allows you to re-distribute it!

Step 2: Edit your HTML file to include some CSS stuff, just so the WebView would know what font you want to use. Here’s a sample file:

<html>
    <head>
        <link href="YourCssFile.css" rel="stylesheet" type="text/css"/>
    </head>
    <body>
        <span class="phon">This string contains special characters: əˈpåstrəfi </span>
    </body>
</html>

Make sure that the href references are correct. In this case, my CSS file, HTML file and font file are in the same folder.

Step 3: Define your CSS file. In this case, our YourCssFile.css would be:

@font-face {
    font-family: "My font";
    src: url('MyFontFile.TTF');
}

.phon, .unicode {
    display: inline;
    font-family: 'My font', Verdana, sans-serif;
    font-size: 14pt;
    font-weight: 500;
    font-style: normal;
    color: black;
}

Step 4: Load the file in your WebView! You can use

WebView webView = (WebView) findViewById(R.id.myWebview);
webView.loadUrl("path/to/html/file");

or

webView.loadDataWithBaseURL("file:///android_asset/",
article, "text/html", Encoding.UTF_8.toString(), null);

If you will use the second option, your article variable would contain the HTML string. Just make sure that you escape your quotation marks with a backslash ().

IMPORTANT NOTE: This feature seems to be broken in Android 2.0 and 2.1, as reported here.