Как встроить собственный шрифт в приложение для Android (WebView)

Я хочу встроить собственный шрифт в свое приложение для Android. Я не использую TextView, поэтому такие руководства, как это (Как использовать собственный шрифт с TextView) не помогают.

В моем случае контент берется из базы данных SQLite и отображается на экране с помощью WebView. Я также не использую связанные файлы HTML, поэтому это руководство (Как использовать собственный шрифт с WebView) тоже не решает мою проблему.

FIY, вот мой код:

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. Есть ли какие-нибудь решения моей проблемы?

Большое Вам спасибо.


person Niamh Doyle    schedule 11.02.2012    source источник
comment
Некоторые рекомендации здесь: stackoverflow.com / questions / 7503133 /   -  person Seva Alekseyev    schedule 11.02.2012
comment
Спасибо, но не в моем случае.   -  person Niamh Doyle    schedule 11.02.2012


Ответы (2)


Из комментариев в этом ответе можно сделать вывод, что возможным решением является использование loadDataWithBaseURL при предоставлении папки с ресурсами в качестве базового URL-адреса, т.е.

LoadData () не работает, но webView.loadDataWithBaseURL ("file: /// android_asset /", ... работает нормально. Тогда также должна работать ссылка на файл шрифта как "/fonts/MyFont.otf". - JaakL Dec 1 ' 11 в 16:59

Я полагаю, объединение вашего шрифта не проблема, верно?

[Edit] Чтобы пояснить свой ответ, я составил небольшой пример. В приведенном ниже коде я поместил Quicksand_Dash.otf в assets / fonts и twitter_logo.png прямо в assets. HTML - это просто строковая константа, но вы можете получить ее из своей базы данных SQLLite. Суть действительно в том, чтобы просто использовать _4 _....

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>";


}
person Paul-Jan    schedule 11.02.2012
comment
Не знаю, понимаю ли я вашу точку зрения, но я пробовал это руководство, и оно работает только тогда, когда текстовые строки, требующие встроенного шрифта, находятся между <body>...</body> внутри HTML-файлов, хранящихся в assets. Однако в моем случае данные взяты из базы данных SQLite. Спасибо. - person Niamh Doyle; 11.02.2012
comment
да. Вот почему я (и цитируемый комментарий) предлагаю вам использовать loadDataWithBaseURL (в отличие от loadURL в этом руководстве). Вы по-прежнему предоставляете URL-адрес ресурса для шрифтов, но html берется из базы данных SQL. - person Paul-Jan; 11.02.2012
comment
Большое спасибо, Пол. Но я не могу адаптировать ваш пример к своему коду. Думаю, на моей стороне что-то несовместимое. Вот почему в Eclipse всегда отображаются нефиксированные ошибки. Я все еще очень стараюсь. - person Niamh Doyle; 11.02.2012
comment
Что ж, в конце концов я смог запустить его, но не так, как я ожидал. Контент моего приложения из его базы данных SQLite не загружен, а просто предложение У меня слабое чувство ... и вместо него логотип. - person Niamh Doyle; 11.02.2012
comment
Да, loadDataWithBaseURL (file: /// android_asset / - это решение. Большое спасибо. - person hobbs; 14.08.2012
comment
Ты спас мою задницу: p +9999 - person haythem souissi; 27.10.2013

Пожалуйста, проверьте ссылки ниже ... я думаю, что это полезно

Как изменить начертание шрифта Webview в Android?

Как использовать собственный шрифт с WebView

Установите собственный шрифт в заголовке html и установите содержимое в теле html. поэтому весь контент отображается в соответствии с вашим встроенным шрифтом в веб-просмотре ...

person SBJ    schedule 11.02.2012
comment
Большое спасибо, я уже пробовал их раньше, но, как я уже сказал, я не использовал связанный файл HTML, поэтому они не помогают. - person Niamh Doyle; 11.02.2012
comment
вы создаете строку времени выполнения, в которой тело html и ваше содержимое sqlite ... не требуется создание файла html. - person SBJ; 11.02.2012