Как изменить шрифт лица Webview в Android? - PullRequest
84 голосов
/ 10 октября 2010

Я хочу изменить шрифт по умолчанию для веб-просмотра на собственный шрифт.Я использую webview для разработки двуязычного приложения для браузера для Android.

Я попытался получить экземпляр пользовательского шрифта, поместив свой собственный шрифт в ресурсы.Но все равно не удалось установить шрифт по умолчанию для веб-просмотра на мой шрифт.

Это то, что я пробовал:

Typeface font = Typeface.createFromAsset(getAssets(), "myfont.ttf"); 
private WebView webview;
WebSettings webSettings = webView.getSettings();
webSettings.setFixedFontFamily(font);

Может кто-нибудь исправить это или предложить какой-либо другой способ изменить шрифт по умолчанию для веб-просмотра наПользовательский шрифт?

Спасибо!

Ответы [ 10 ]

100 голосов
/ 13 сентября 2011

Есть рабочий пример этого в этом проекте . Это сводится к:

  1. В папке assets/fonts поместите нужный шрифт OTF или TTF (здесь MyFont.otf)
  2. Создайте файл HTML, который вы будете использовать для содержимого WebView, внутри папки assets (здесь, внутри assets/demo/my_page.html):

    <html>
    <head>
    <style type="text/css">
    @font-face {
        font-family: MyFont;
        src: url("file:///android_asset/fonts/MyFont.otf")
    }
    body {
        font-family: MyFont;
        font-size: medium;
        text-align: justify;
    }
    </style>
    </head>
    <body>
    Your text can go here! Your text can go here! Your text can go here!
    </body>
    </html>
    
  3. Загрузить HTML-код в WebView из кода:

    webview.loadUrl("file:///android_asset/demo/my_page.html");
    

Обратите внимание, что внедрение HTML через loadData() недопустимо. Согласно документации :

Обратите внимание, что та же политика происхождения JavaScript означает, что сценарий, выполняемый на странице, загруженной с использованием этого метода, не сможет получить доступ к содержимому, загруженному с использованием любой схемы, кроме 'data', включая 'http (s)'. Чтобы избежать этого ограничения, используйте loadDataWithBaseURL () с соответствующим базовым URL.

Как @JaakL предлагает в комментарии ниже, для загрузки HTML из строки вы должны вместо этого предоставить базовый URL, указывающий на ваши активы:

webView.loadDataWithBaseURL("file:///android_asset/", htmlData);

При ссылке на шрифт в htmlData вы можете просто использовать /fonts/MyFont.otf (без базового URL).

92 голосов
/ 20 февраля 2014

Я использую этот код :

wv = (WebView) findViewById(R.id.webView1);
String pish = "<html><head><style type=\"text/css\">@font-face {font-family: MyFont;src: url(\"file:///android_asset/font/BMitra.ttf\")}body {font-family: MyFont;font-size: medium;text-align: justify;}</style></head><body>";
String pas = "</body></html>";
String myHtmlString = pish + YourTxext + pas;
wv.loadDataWithBaseURL(null,myHtmlString, "text/html", "UTF-8", null);
48 голосов
/ 21 апреля 2011

Еще проще, вы можете использовать формат URL ресурса для ссылки на шрифт. Программирование не требуется!

@font-face {
   font-family: 'myface';
   src: url('file:///android_asset/fonts/myfont.ttf'); 
} 

body { 
   font-family: 'myface', serif;

...

25 голосов
/ 24 марта 2011

Это можно сделать в Android. Мне потребовалось три дня, чтобы решить эту проблему. Но сейчас это кажется очень простым. Выполните следующие действия, чтобы установить собственный шрифт для Webview

.

1.Добавьте ваш шрифт в папку активов
2. Скопируйте шрифт в каталог файлов приложения

private boolean copyFile(Context context,String fileName) {
        boolean status = false;
        try { 
            FileOutputStream out = context.openFileOutput(fileName, Context.MODE_PRIVATE);
            InputStream in = context.getAssets().open(fileName);
            // Transfer bytes from the input file to the output file
            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            // Close the streams
            out.close();
            in.close();
            status = true;
        } catch (Exception e) {
            System.out.println("Exception in copyFile:: "+e.getMessage());
            status = false;
        }
        System.out.println("copyFile Status:: "+status);
        return status;
    }

3.Вы должны вызывать вышеуказанную функцию только один раз (для этого нужно найти логику).

copyFile(getContext(), "myfont.ttf");

4. Используйте приведенный ниже код, чтобы установить значение для вашего веб-просмотра. Здесь я использую CSS для установки шрифта.

private String getHtmlData(Context context, String data){
    String head = "<head><style>@font-face {font-family: 'verdana';src: url('file://"+ context.getFilesDir().getAbsolutePath()+ "/verdana.ttf');}body {font-family: 'verdana';}</style></head>";
    String htmlData= "<html>"+head+"<body>"+data+"</body></html>" ;
    return htmlData;
 }

5.Вы можете вызвать вышеуказанную функцию, как показано ниже

webview.loadDataWithBaseURL(null, getHtmlData(activity,htmlData) , "text/html", "utf-8", "about:blank");
10 голосов
/ 08 июня 2016

я сделал это верхними ответами с этими дополнениями:

webView.loadDataWithBaseURL("file:///android_asset/",
                            WebClient.getStyledFont(someText),
                            "text/html; charset=UTF-8", null, "about:blank");

и затем используйте src: url("file:///android_asset/fonts/YourFont...

public static String getStyledFont(String html) {
    boolean addBodyStart = !html.toLowerCase().contains("<body>");
    boolean addBodyEnd = !html.toLowerCase().contains("</body");
    return "<style type=\"text/css\">@font-face {font-family: CustomFont;" +
            "src: url(\"file:///android_asset/fonts/Brandon_reg.otf\")}" +
            "body {font-family: CustomFont;font-size: medium;text-align: justify;}</style>" +
            (addBodyStart ? "<body>" : "") + html + (addBodyEnd ? "</body>" : "");
}


спасибо всем:)

4 голосов
/ 25 июня 2015

Многие из приведенных выше ответов сработают, если у вас есть контент в папке ресурсов.

Однако если вы хотите, чтобы я захотел загрузить и сохранить все ваши ресурсы с сервера во внутреннее хранилище, вы можете вместо этого использовать loadDataWithBaseURL и использовать ссылку на ваше внутреннее хранилище как baseUrl. Тогда все файлы будут относиться к загруженному html и будут найдены и использованы правильно.

Во внутреннем хранилище я сохранил следующие файлы:

  • IndigoAntiqua2Text-Regular.ttf
  • style.css
  • image.png

Тогда я использую следующий код:

WebView web = (WebView)findViewById(R.id.webby);
//For avoiding a weird error message
web.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

String webContent = "<!DOCTYPE html><html><head><meta charset=\"UTF-8\"><link rel=\"stylesheet\" href=\"style.css\"></head>"
                            + "<body><img src='image.png' width=\"100px\"><div class=\"running\">I am a text rendered with INDIGO</div></body></html>";

String internalFilePath = "file://" + getFilesDir().getAbsolutePath() + "/";
web.loadDataWithBaseURL(internalFilePath, webContent, "text/html", "UTF-8", "");

Файл CSS, используемый в приведенном выше html (style.css):

@font-face {
  font-family: 'MyCustomRunning';
  src: url('IndigoAntiqua2Text-Regular.ttf')  format('truetype');
}

.running{
    color: #565656;
     font-family: "MyCustomRunning";
     font-size: 48px;
}

Я пробовал это только при настройке minSdkVersion 19 (4.4), поэтому не знаю, работает ли он в других версиях

3 голосов
/ 03 сентября 2017
 webview= (WebView) findViewById(R.id.webview);
 String myCustomStyleString="<style type=\"text/css\">@font-face {font-family: MyFont;src: url(\"file:///android_asset/fonts/iranian_sans.ttf\")}body,* {font-family: MyFont; font-size: 13px;text-align: justify;}img{max-width:100%;height:auto; border-radius: 8px;}</style>";
 webview.loadDataWithBaseURL("", myCustomStyleString+"<div style=\"direction:rtl\">"+intentpost.getStringExtra("content")+"</div>", "text/html", "utf-8", null);
1 голос
/ 12 июля 2013

Проблема в том, что он должен находиться в папке, попробуйте вместо этого поместить «./myfont.ttf», если не помещаете шрифт в папку в ресурсах, таких как «fonts / myfont.ttf», которые наверняка будут работать.

1 голос
/ 13 февраля 2011

Вы можете сделать это с помощью CSS.Я сделал это с помощью приложения, но оно не будет работать в Android 2.1, поскольку существует известная ошибка в браузере Android 2.1.

0 голосов
/ 10 июля 2013

Вот как вы загружаете htmlData в веб-просмотр:

webview.loadDataWithBaseURL(null, getHtmlData(activity,**htmlData**) , "text/html", "utf-8", "about:blank");

где getHtmlData(activity,**htmlData**) возвращает строку HTML-кода.

...