我正在寻找一种简单的方法来忘记我正在使用WebView在TextView中使用合理的文本.有人为此制作了自定义视图吗?我很清楚我可以这样做:
WebView view = new WebView(this); view.loadData("my html with text justification","text/html","utf-8");
解决方法
我承认,这让我神经紧张.我喜欢TextViews在代码中看起来像TextViews,即使我使用WebView作为实现text-align:justified格式化的手段,我也不想那样看.
我创建了一个自定义视图(丑陋,可能很糟糕),它实现了我在TextView中常用的方法,并修改了WebView的内容以反映这些更改.
对于其他人或者我真正不知道的潜在危险它是有用的,对我来说它有效,我已经在几个项目中使用它并且没有遇到任何问题.唯一的小麻烦是我认为它是一个更大的收费记忆,但如果它只是一两个就没有什么可担心的(如果我错了,请纠正我).
结果如下:
以编程方式设置它的代码就像这样简单:
JustifiedTextView J = new JustifiedTextView(); J.setText("insert your text here");
当然,保留它是愚蠢的,所以我还添加了改变字体大小和字体颜色的方法,这些方法基本上都是我使用的TextViews.意思是我可以这样做:
JustifiedTextView J = new JustifiedTextView(); J.setText("insert your text here"); J.setTextColor(Color.RED); J.setTextSize(30);
并获得以下结果(图像被裁剪):
但是,这不是向我们展示它的外观,而是分享你是如何做到的!
我知道我知道.
这是完整的代码.它还解决了设置透明背景和将UTF-8字符串加载到视图中时的问题.有关详细信息,请参阅reloadData()中的注释.
public class JustifiedTextView extends WebView{ private String core = "<html><body style='text-align:justify;color:rgba(%s);font-size:%dpx;margin: 0px 0px 0px 0px;'>%s</body></html>"; private String textColor = "0,255"; private String text = ""; private int textSize = 12; private int backgroundColor=Color.TRANSPARENT; public JustifiedTextView(Context context,AttributeSet attrs) { super(context,attrs); this.setWebChromeClient(new WebChromeClient(){}); } public void setText(String s){ this.text = s; reloadData(); } @SuppressLint("NewApi") private void reloadData(){ // loadData(...) has a bug showing utf-8 correctly. That's why we need to set it first. this.getSettings().setDefaultTextEncodingName("utf-8"); this.loadData(String.format(core,textColor,textSize,text),"utf-8"); // set WebView's background color *after* data was loaded. super.setBackgroundColor(backgroundColor); // Hardware rendering breaks background color to work as expected. // Need to use software renderer in that case. if(android.os.Build.VERSION.SDK_INT >= 11) this.setLayerType(WebView.LAYER_TYPE_SOFTWARE,null); } public void setTextColor(int hex){ String h = Integer.toHexString(hex); int a = Integer.parseInt(h.substring(0,2),16); int r = Integer.parseInt(h.substring(2,4),16); int g = Integer.parseInt(h.substring(4,6),16); int b = Integer.parseInt(h.substring(6,8),16); textColor = String.format("%d,%d,%d",r,g,b,a); reloadData(); } public void setBackgroundColor(int hex){ backgroundColor = hex; reloadData(); } public void setTextSize(int textSize){ this.textSize = textSize; reloadData(); } }