在安卓的WebView中如何设置文本大小

32

我正在使用 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>

你已经用设备测试过你的应用程序了吗? - Imtiyaz Khalani
是的,我会在设备上测试我的代码。 - John R
如果您去除透明度,这会提高性能吗? - ksasq
11个回答

64

设置文本大小的方法之一是通过布局文件-

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);
在values文件夹中-
<resources>

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

</resources>

希望它能正常工作。


2
类型WebSettings中的方法setRenderPriority(WebSettings.RenderPriority)已过时。 - S.M_Emamian
5
我测试了你的代码。看起来你不应该将字体大小从dimen传递给setDefaultFontSize()方法。例如,如果你想以12sp大小显示文本,只需将12直接传递给该方法即可。 - Misagh Emamverdi

20
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);

加载时间仍然相同。我正在使用最低SDK版本8。 - John R
如果我将字体大小设置为10,那么在所有设备上都是一样的吗? - John R
而且.setRenderPriority被黑线切断了。 - John R

9

1 - 我正在使用这段代码,在我所有的设备上都得到了不错的结果。

如果 web 是你的 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();
int 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);

为了

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行的文本将会迅速加载。

而且 .setDefaultFontSize 需要 int 值错误。 - John R
@AartooDetto,我已经使用你之前的答案中的转换解决了这个整数问题。但是文本仍需要1秒钟才能加载。 - John R
在模拟器上还是在实体设备上运行?因为后者肯定更快。这个速度显然会因设备而异,因为有双核、四核、八核(...)和不同速度的设备(今天1000 MHz的速度很常见)。所以,我猜在实体设备上它会运行得非常非常快。 - Phantômaxx
所以...我真的不知道如何再挤出更多的汁了 :( - Phantômaxx
API级别低于8不支持.setRenderPriority? - John R
显示剩余6条评论

8

我不确定这是否符合您的要求,但只要您不想根据文本宽度/高度进行计算来设置文本大小,那么这应该是您要寻找的:

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

您也可以尝试将此添加到您的清单文件中:

android:hardwareAccelerated="true"

1
你在Android Kit Kat设备上遇到这个问题吗?还是其他设备也有? - nKn
你是否在WebView后面加载了一些东西?我的意思是,是否有一些阻止WebView加载的东西,比如一个ImageView或一些网络操作? - nKn
我正在XML中设置背景。在活动中,使用以上代码加载文本。 - John R
请查看我的更新,它应该增强您的WV的渲染。 - nKn

6

WebView 中设置字体大小有三种方法。

1) WebView.setDefaultFontSize(int)

webview.setDefaultFontSize(50);

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

该代码片段是用于设置 Android 应用程序中的 WebView 字体大小,使用该代码可将字体设置为最小。
WebView.getSettings().setTextSize(TextSize.SMALLEST); 

或者

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

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

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

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

用于立即显示文本而不是任何答案的程序相关内容。请告诉我如何立即显示文本? - John R

3

webSettings.setTextSize现在已经过时。

您可以使用setTextZoomgetTextZoom来改变webview字体的大小。

对于普通的文本大小,您可以给出100的整数值。如果您想增加字体的大小,那么您可以使用以下代码:

webView.settings.textZoom = 125

3

您可以始终使用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");

为了更快地显示,正如Digvesh Patel之前所说:
webview.getSettings().setRenderPriority(RenderPriority.HIGH);
webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

2
在Kotlin中,只需添加以下这行代码即可:

最初的回答


webview.settings.defaultFontSize = yourSizeInInteger

1

你能解释一下在哪里使用这段代码以及我需要做的其他更改吗? - John R
你可以使用textview.setText(html.fromHtml())将其设置在TextView上。 - user8938
textview.setText(html.fromHtml("你的文本")); - user8938
文本显示但不对齐。 - John R
你设置了TextView.setGravity("center")吗? - user8938
显示剩余3条评论

1
webView.getSettings().setDefaultFontSize(5); //5 or any dmen you want

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