我想将webview的默认字体更改为自定义字体.我正在使用webview开发Android的双语浏览器应用程序.
我尝试通过将自定义字体放在资源中来获取自定义字体的实例.但仍然无法将webview的默认字体设置为我的字体.
这是我试过的:
Typeface font = Typeface.createFromAsset(getAssets(), "myfont.ttf"); private WebView webview; WebSettings webSettings = webView.getSettings(); webSettings.setFixedFontFamily(font);
任何人都可以更正此或建议任何其他方法将webview的默认字体更改为自定义字体?
谢谢!
这个项目有一个很好的例子.归结为:
在您的assets/fonts
文件夹中,放置所需的OTF或TTF字体(此处为MyFont.otf)
在assets
文件夹内(此处为内部assets/demo/my_page.html
)创建一个HTML文件,用于WebView的内容:
Your text can go here! Your text can go here! Your text can go here!
从代码中将HTML加载到WebView中:
webview.loadUrl("file:///android_asset/demo/my_page.html");
请注意,loadData()
不允许注入HTML .根据文件:
请注意,JavaScript的相同原始策略意味着在使用此方法加载的页面中运行的脚本将无法访问使用"数据"以外的任何方案加载的内容,包括"http(s)".要避免此限制,请将loadDataWithBaseURL()与适当的基本URL一起使用.
正如@JaakL在下面的评论中建议的,要从字符串加载HTML,您应该提供指向您的资产的基本URL:
webView.loadDataWithBaseURL("file:///android_asset/", htmlData);
在引用字体时htmlData
,您可以简单地使用/fonts/MyFont.otf
(省略基本URL).
我正在使用此代码:
wv = (WebView) findViewById(R.id.webView1); String pish = ""; String pas = ""; String myHtmlString = pish + YourTxext + pas; wv.loadDataWithBaseURL(null,myHtmlString, "text/html", "UTF-8", null);
更简单的是,您可以使用资产URL格式来引用字体.无需编程!
@font-face { font-family: 'myface'; src: url('file:///android_asset/fonts/myfont.ttf'); } body { font-family: 'myface', serif;
...
它可以在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; }
你只需要调用一次上面的函数(你必须找到一些逻辑).
copyFile(getContext(), "myfont.ttf");
4.使用以下代码为webview设置值.这里我使用CSS来设置字体.
private String getHtmlData(Context context, String data){ String head = ""; String htmlData= ""+head+""+data+"" ; return htmlData; }
你可以按以下方式调用上述功能
webview.loadDataWithBaseURL(null, getHtmlData(activity,htmlData) , "text/html", "utf-8", "about:blank");
我用上面的答案做了这个添加:
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(""); boolean addBodyEnd = !html.toLowerCase().contains("@font-face {font-family: CustomFont;" + "src: url(\"file:///android_asset/fonts/Brandon_reg.otf\")}" + "body {font-family: CustomFont;font-size: medium;text-align: justify;}" + (addBodyStart ? "" : "") + html + (addBodyEnd ? "" : ""); }
谢谢大家:)
如果您的资产文件夹中有内容,则上述许多答案的工作都非常有魅力。
但是,如果像我这样想要将所有资产从服务器下载并保存到内部存储中,则可以使用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 = "" + "I am a text rendered with INDIGO"; String internalFilePath = "file://" + getFilesDir().getAbsolutePath() + "/"; web.loadDataWithBaseURL(internalFilePath, webContent, "text/html", "UTF-8", "");
上面的html(style.css)中使用的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)时尝试过此操作,所以我不知道它是否可以在其他版本上使用