Как установить размер текста в WebView на Android

Я использую WebView для выравнивания текста. Я хочу знать-

  1. Можно ли установить размер текста в файле layout? Поскольку мне нужен разный размер текста для разных размеров экрана.

  2. А также одна проблема - сначала появляется фон, а затем через 2 секунды отображается текст. Можно ли отображать текст сразу?

Размер текста 7-8 строк.

Код-

public class Main extends Activity {

       WebView mWebView;

       @Override
       public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);        
          mWebView = (WebView) findViewById(R.id.webview);
          String text = "<html><body>"+"<p align=\"justify\">"+getString(R.string.itext)+"</p>"+"</body></html>"; 
      mWebView .loadData(text, "text/html", "utf-8");
      mWebView .setBackgroundColor(Color.TRANSPARENT);
       }
}

XML-

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:orientation="vertical" 
       android:layout_width="fill_parent"
       android:layout_height="fill_parent" 
       android:background="@drawable/light">

<WebView
    android:id="@+id/webview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@android:color/transparent"/>
</LinearLayout>

person John R    schedule 11.02.2014    source источник
comment
Вы тестировали свое приложение на устройстве?   -  person Imtiyaz Khalani    schedule 15.02.2014
comment
Да, я тестирую свой код на устройстве.   -  person John R    schedule 16.02.2014
comment
Если вы удалите прозрачность, это улучшит производительность?   -  person ksasq    schedule 22.02.2014


Ответы (9)


Для установки размера текста из layout-

final WebSettings webSettings = web.getSettings();
Resources res = getResources();
fontSize = res.getDimension(R.dimen.txtSize);
webSettings.setDefaultFontSize((int)fontSize);

Для немедленного отображения текста-

webSettings.setRenderPriority(RenderPriority.HIGH);
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
webSettings.setAppCacheEnabled(false);
webSettings.setBlockNetworkImage(true);
webSettings.setLoadsImagesAutomatically(true);
webSettings.setGeolocationEnabled(false);
webSettings.setNeedInitialFocus(false);
webSettings.setSaveFormData(false);

В папке значений-

<resources>

    <dimen name="txtSize">26sp</dimen>

</resources>

Надеюсь, что это работает.

person Kanwaljit Singh    schedule 22.02.2014
comment
Метод setRenderPriority(WebSettings.RenderPriority) из типа WebSettings устарел. - person S.M_Emamian; 21.07.2014
comment
Я тестирую ваш код. Кажется, вы не должны передавать размер шрифта из dimen в setDefaultFontSize(). Например, если вы хотите отобразить свой текст с размером 12 sp, вы должны просто передать 12 этому методу. - person Misagh Emamverdi; 04.10.2014

WebSettings webSettings = webView.getSettings();

либо setTextSize, либо

webSettings.setTextSize(WebSettings.TextSize.SMALLEST);

Этот тоже работает:

webSettings.setDefaultFontSize(10);

И сразу отображать текст:

webview.getSettings().setRenderPriority(RenderPriority.HIGH);
webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
webview.setBlockNetworkImage(true);
webview.setLoadsImagesAutomatically(true);
webwebviewSettings.setGeolocationEnabled(false);
webview.setNeedInitialFocus(false);
webview.setSaveFormData(false);
person Digvesh Patel    schedule 17.02.2014
comment
по-прежнему требуется то же время для загрузки. Я использую минимальную версию SDK 8. - person John R; 20.02.2014
comment
Если я установлю размер шрифта на 10, то он будет одинаковым на всех устройствах? - person John R; 20.02.2014
comment
А .setRenderPriority обрезан черной линией. - person John R; 20.02.2014

Я не уверен, что это то, что вы ищете, но если вы не хотите устанавливать размер текста на основе расчета ширины/высоты текста, это должно быть то, что вы ищете:

WebSettings settings = yourWebView.getSettings();

Таким образом, вы получаете настройки WebView, размер текста которых вы пытаетесь изменить.

Есть некоторые предопределенные значения, которые вы можете установить в качестве размера, используя класс TextSize, например:

settings.setTextSize(TextSize.SMALLEST);
settings.setTextSize(TextSize.SMALLER);
settings.setTextSize(TextSize.NORMAL);
settings.setTextSize(TextSize.BIGGER);
settings.setTextSize(TextSize.BIGGEST);

Вы можете просто выбрать, какой из них вам нужно установить, в зависимости от параметров текущего устройства, которое вы выбираете.

Если вы, наоборот, хотите сделать какой-то расчет ширины/высоты экрана и установить результат как конкретное значение, вы можете даже использовать это:

settings.setDefaultFontSize(an_integer_that_goes_between_1_and_72);

---- ИЗМЕНИТЬ ----

Чтобы улучшить визуализацию WebView, попробуйте следующее:

mWebView.getSettings().setRenderPriority(RenderPriority.HIGH);
mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

Вы также можете попробовать добавить это в свой файл Manifest:

android:hardwareAccelerated="true"
person nKn    schedule 15.02.2014
comment
Вы сталкиваетесь с этим на устройствах Android Kit Kat или других устройствах? - person nKn; 16.02.2014
comment
Вы загружаете что-то за WebView? Я имею в виду, есть ли что-то, что блокирует загрузку WebView, например, ImageView или какая-то сетевая операция? - person nKn; 17.02.2014
comment
Я устанавливаю фон в xml. И в действии загрузка текста с использованием вышеуказанного кодирования. - person John R; 17.02.2014
comment
Пожалуйста, посмотрите мое обновление, оно должно улучшить визуализацию вашего WV. - person nKn; 17.02.2014

1 - я использую этот код, который дает мне хороший результат на всех моих устройствах.

Если веб — это ваш WebView,

web = (WebView) v.findViewById(R.id.htmlDisplay);
// Impostazioni della WebView.
final WebSettings webSettings = web.getSettings();
// Set the font size (in sp).
webSettings.setDefaultFontSize(20);

Хорошо, это жестко закодировано

Теперь более динамичное решение (согласно вашему вопросу):

Если вы поместите желаемый размер в файл целых чисел (несколько, по одному для каждого экрана, который вы поддерживаете), вы можете сделать это, чтобы получить его значение:

Resources res = getResources();
float fontSize = res.getInteger(R.integer.font_size);
webSettings.setDefaultFontSize(fontSize);

Предполагая, что ваши файлы res/values/integers.xml похожи на этот:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="font_size">20</integer>
</resources>

Поэтому измените эту строку в приведенном выше коде

webSettings.setDefaultFontSize(20);

to

webSettings.setDefaultFontSize(fontSize);

2 - Чтобы загружать вещи быстрее, я использую следующий код

// Optimize loading times.
webSettings.setAppCacheEnabled(false);
webSettings.setBlockNetworkImage(true);
webSettings.setLoadsImagesAutomatically(true);
webSettings.setGeolocationEnabled(false);
webSettings.setNeedInitialFocus(false);
webSettings.setSaveFormData(false);

Обратите внимание, что я загружаю более 7-8 строк текста: это полноценная HTML-страница с JavaScript для расширения/свертывания разделов. И загружается, скажем, полсекунды. Так что, полагаю, 7-8 строк текста загрузится в один миг.

person Phantômaxx    schedule 15.02.2014
comment
Это занимает почти 1 сек. - person John R; 20.02.2014
comment
@AartooDetoo, а куда добавить эти строчки? - person John R; 20.02.2014
comment
@JohnR: после определения WebView и объявления объекта WebSettings. Видите ли, я обновил свой ответ, добавив больше настроек для размышления. - person Phantômaxx; 20.02.2014
comment
@AartooDetoo Строки, которые вы только что редактировали, когда я добавляю их в свой код. Появляется черный экран, а текст не появляется. И некоторые линии обрезаны черными линиями. Возможно, не поддерживается, так как минимальная версия SDK в моем приложении — 8. - person John R; 20.02.2014
comment
И .setDefaultFontSize требует ошибки значения int. - person John R; 20.02.2014
comment
Использование dimens.xml изменено на использование integers.xml. Теперь в примере используется целое число (динамически устанавливаемое в res/values/integers.xml) вместо размеров в sp. Я также удалил непроверенные веб-настройки и оставил только те, которые использую (что очень помогло мне ускорить загрузку файлов справки в формате HTML). - person Phantômaxx; 20.02.2014
comment
@AartooDetto Я решил эту целочисленную проблему, используя приведение в вашем предыдущем ответе. Но текст по-прежнему загружается за 1 секунду. - person John R; 20.02.2014
comment
На эмуляторе или на физическом устройстве? Потому что последний, безусловно, быстрее. Эта скорость, очевидно, будет варьироваться от устройства к устройству, поскольку есть двухъядерные, четырехъядерные, восьмиядерные (...) и с разными скоростями (сегодня довольно распространена скорость 1000 МГц). Итак, я предполагаю, что на физическом устройстве это будет работать НА МУУУУУУУУУУУУУУУУУУУУЖЕ быстрее. - person Phantômaxx; 20.02.2014
comment
Так что... я действительно не знаю, как выжать больше сока :( - person Phantômaxx; 20.02.2014
comment
.setRenderPriority не поддерживается уровнем API ниже 8? - person John R; 20.02.2014
comment
С официального сайта: setRenderPriority(WebSettings.RenderPriority priority) Этот метод устарел в уровне API 18. Не рекомендуется настраивать приоритеты потоков, и это не будет поддерживаться в будущих версиях. Он был добавлен в API Level 1. - person Phantômaxx; 20.02.2014

Есть три способа установить FontSize на WebView.

1) WebView.setDefaultFontSize(int)

webview.setDefaultFontSize(50);

2) WebView.getSettings().setTextSize (WebSettings.TextSize.SMALLEST)

WebView.getSettings().setTextSize(TextSize.SMALLEST); 

or

WebView.getSettings().setTextSize(TextSize.SMALLER); 

or

WebView.getSettings().setTextSize(TextSize.NORMAL); 

or

WebView.getSettings().setTextSize(TextSize.BIGGER); 

or

WebView.getSettings().setTextSize(TextSize.BIGGEST);

3) Добавьте размер шрифта в формате html.

String text = "<html><body style=\"color:black;font-family:Helvetica;font-size:12px;\"'background-color:transparent' >"+"<p align=\"justify\">"+getString(R.string.itext)+"</p>"+"</body></html>"; 
person Niranj Patel    schedule 21.02.2014
comment
Для немедленного отображения текста не работает ни один ответ. Подскажите пожалуйста, как вывести текст сразу? - person John R; 22.02.2014

Вы всегда можете использовать CSS для изменения размера шрифта:

String text = "<html><style type=\"text/css\">p{text-align:justify;font-size:80%;}</style></head><body>"+"<p>"+getString(R.string.text1)+"</p>"+"</body></html>";

mWebView.loadData(text, "text/html", "utf-8");

Чтобы отобразить фатер, как сказал Дигвеш Патель:

webview.getSettings().setRenderPriority(RenderPriority.HIGH);
webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
person Luciano Rodríguez    schedule 19.02.2014

Вы можете использовать Html.fromHtml() и написать свой текст в формате HTML.

person user8938    schedule 11.02.2014
comment
можете ли вы объяснить, где использовать этот код и другие изменения, которые мне нужно сделать? - person John R; 11.02.2014
comment
вы можете установить его в текстовом виде, используя textview.setText(html.fromHtml()) - person user8938; 11.02.2014
comment
только этой строчки достаточно для обоснования? - person John R; 11.02.2014
comment
А куда писать текст в html? - person John R; 11.02.2014
comment
нет, вам нужно написать свой текст с тегом html ex textview.setText(html.fromHtml(‹html›‹body›‹p align=justify›your text‹/p›‹/body›‹/html›)); - person user8938; 11.02.2014
comment
Отображение текста, но без обоснования. - person John R; 11.02.2014
comment
вы установили textview.setGravity(center); - person user8938; 11.02.2014
comment
давайте продолжим это обсуждение в чате - person John R; 11.02.2014

В котлин просто добавьте эту строку,

webview.settings.defaultFontSize = yourSizeInInteger
person Al Walid Ashik    schedule 16.07.2019

webSettings.setTextSize больше не используется.

Вы можете использовать setTextZoom ИЛИ getTextZoom для изменения размера шрифта webview.

Для обычного размера текста вы можете указать целочисленное значение как 100. И если вы хотите увеличить размер шрифта, вы можете использовать код, как показано ниже:

webView.settings.textZoom = 125
person maulik panchal    schedule 13.03.2020