使用WebView在Android应用程序中alignment文本,但呈现类似于TextView的界面?

我正在寻找一种简单的方法来忘记我正在使用WebView在我的TextView有正确的文本。 有人为此做了一个自定义的视图吗? 我很清楚,我可以做这样的事情:

  WebView view = new WebView(this); view.loadData("my html with text justification","text/html","utf-8"); 

但是当你想要设置TextView的大小,颜色或其他常见属性时,它会变得很难看。 必须有一个更方便的做法。

Solutions Collecting From Web of "使用WebView在Android应用程序中alignment文本,但呈现类似于TextView的界面?"

这让我很紧张,我承认这一点。 我喜欢TextViews在代码中看起来像TextViews ,即使我使用WebView作为实现text-align:justified格式的手段,我也不想这样看。

我创build了一个自定义视图(丑陋的,可能是不好的),它实现了我通常从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-8string加载到视图中时的问题。 有关详细信息,请参阅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,0,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), "text/html","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,%d", r, g, b, a); reloadData(); } public void setBackgroundColor(int hex){ backgroundColor = hex; reloadData(); } public void setTextSize(int textSize){ this.textSize = textSize; reloadData(); } } 

没有webview解决scheme是: https : //github.com/merterhk/JustifiedTextView

 import java.util.ArrayList; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Typeface; import android.text.TextPaint; import android.view.View; public class JustifiedTextView extends View { String text; ArrayList<Line> linesCollection = new ArrayList<Line>(); TextPaint textPaint; Typeface font; int textColor; float textSize = 42f, lineHeight = 57f, wordSpacing = 15f, lineSpacing = 15f; float onBirim, w, h; float leftPadding, rightPadding; public JustifiedTextView(Context context, String text) { super(context); this.text = text; init(); } private void init() { textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); textColor = Color.BLACK; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (font != null) { font = Typeface.createFromAsset(getContext().getAssets(), "font/Trykker-Regular.ttf"); textPaint.setTypeface(font); } textPaint.setColor(textColor); int minw = getPaddingLeft() + getPaddingRight() + getSuggestedMinimumWidth(); w = resolveSizeAndState(minw, widthMeasureSpec, 1); h = MeasureSpec.getSize(widthMeasureSpec); onBirim = 0.009259259f * w; lineHeight = textSize + lineSpacing; leftPadding = 3 * onBirim + getPaddingLeft(); rightPadding = 3 * onBirim + getPaddingRight(); textPaint.setTextSize(textSize); wordSpacing = 15f; Line lineBuffer = new Line(); this.linesCollection.clear(); String[] lines = text.split("\n"); for (String line : lines) { String[] words = line.split(" "); lineBuffer = new Line(); float lineWidth = leftPadding + rightPadding; float totalWordWidth = 0; for (String word : words) { float ww = textPaint.measureText(word) + wordSpacing; if (lineWidth + ww + (lineBuffer.getWords().size() * wordSpacing) > w) {// is lineBuffer.addWord(word); totalWordWidth += textPaint.measureText(word); lineBuffer.setSpacing((w - totalWordWidth - leftPadding - rightPadding) / (lineBuffer.getWords().size() - 1)); this.linesCollection.add(lineBuffer); lineBuffer = new Line(); totalWordWidth = 0; lineWidth = leftPadding + rightPadding; } else { lineBuffer.setSpacing(wordSpacing); lineBuffer.addWord(word); totalWordWidth += textPaint.measureText(word); lineWidth += ww; } } this.linesCollection.add(lineBuffer); } setMeasuredDimension((int) w, (int) ((this.linesCollection.size() + 1) * lineHeight + (10 * onBirim))); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawLine(0f, 10f, getMeasuredWidth(), 10f, textPaint); float x, y = lineHeight + onBirim; for (Line line : linesCollection) { x = leftPadding; for (String s : line.getWords()) { canvas.drawText(s, x, y, textPaint); x += textPaint.measureText(s) + line.spacing; } y += lineHeight; } } public String getText() { return text; } public void setText(String text) { this.text = text; } public Typeface getFont() { return font; } public void setFont(Typeface font) { this.font = font; } public float getLineHeight() { return lineHeight; } public void setLineHeight(float lineHeight) { this.lineHeight = lineHeight; } public float getLeftPadding() { return leftPadding; } public void setLeftPadding(float leftPadding) { this.leftPadding = leftPadding; } public float getRightPadding() { return rightPadding; } public void setRightPadding(float rightPadding) { this.rightPadding = rightPadding; } public void setWordSpacing(float wordSpacing) { this.wordSpacing = wordSpacing; } public float getWordSpacing() { return wordSpacing; } public float getLineSpacing() { return lineSpacing; } public void setLineSpacing(float lineSpacing) { this.lineSpacing = lineSpacing; } class Line { ArrayList<String> words = new ArrayList<String>(); float spacing = 15f; public Line() { } public Line(ArrayList<String> words, float spacing) { this.words = words; this.spacing = spacing; } public void setSpacing(float spacing) { this.spacing = spacing; } public float getSpacing() { return spacing; } public void addWord(String s) { words.add(s); } public ArrayList<String> getWords() { return words; } } } 

这是Juan给出的JustifiedTextView类(由我编辑),但扩展到可以在您的布局xml文件中使用的自定义xml属性。 即使Eclipse布局编辑器也会在属性表中显示您的自定义属性,这很酷。 我把这个额外的答案,以防万一你想保持干净,不需要XML属性。

 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 text; private int textColor; private int backgroundColor; private int textSize; public JustifiedTextView(Context context, AttributeSet attrs) { super(context, attrs); init(attrs); } public JustifiedTextView(Context context, AttributeSet attrs, int i) { super(context, attrs, i); init(attrs); } @SuppressLint("NewApi") public JustifiedTextView(Context context, AttributeSet attrs, int i, boolean b) { super(context, attrs, i, b); init(attrs); } private void init(AttributeSet attrs) { TypedArray a=getContext().obtainStyledAttributes( attrs, R.styleable.JustifiedTextView); text = a.getString(R.styleable.JustifiedTextView_text); if(text==null) text=""; textColor = a.getColor(R.styleable.JustifiedTextView_textColor, Color.BLACK); backgroundColor = a.getColor(R.styleable.JustifiedTextView_backgroundColor, Color.TRANSPARENT); textSize = a.getInt(R.styleable.JustifiedTextView_textSize, 12); a.recycle(); this.setWebChromeClient(new WebChromeClient(){}); reloadData(); } public void setText(String s){ if(s==null) this.text=""; else this.text = s; reloadData(); } @SuppressLint("NewApi") private void reloadData(){ if(text!=null) { String data = String.format(core,toRgba(textColor),textSize,text); Log.d("test", data); this.loadDataWithBaseURL(null, data, "text/html","utf-8", null); } // 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){ textColor = hex; reloadData(); } public void setBackgroundColor(int hex){ backgroundColor = hex; reloadData(); } public void setTextSize(int textSize){ this.textSize = textSize; reloadData(); } private String toRgba(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); return String.format("%d,%d,%d,%d", r, g, b, a); } } 

或者将其作为justified_text_view_attr.xml添加到res / values /文件夹中,或者将其合并到您现有的attrs.xml中:

 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="JustifiedTextView"> <attr name="text" format="string" localization="suggested"/> <attr name="textColor" format="color|reference" /> <attr name="backgroundColor" format="color|reference" /> <attr name="textSize" format="integer" min="1" /> </declare-styleable> </resources> 

如果发现任何错误,请随意编辑。

看看这个链接。 它使用WebView来完全certificateAndroid中CheckBox的文本。 它也可以在TextView中完全相同,因为每个CheckBox实际上都是一个TextView和一个Button。 http://www.collegemobile.com/2014/09/justify-text-android-checkbox/

我相信这个最简单的forms。 而且我工作完美

 package domo.suichbt.util; import android.content.Context; import android.text.Html; import android.util.AttributeSet; import android.widget.TextView; public class JustifiedTextView extends TextView { private final String CORE_TEMPLATE = "<html><body style='text- align:justify;margin: 0px 0px 0px 0px;'>%s</body></html>"; public JustifiedTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); setText(Html.fromHtml(String.format(CORE_TEMPLATE,getText()))); } public JustifiedTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setText(Html.fromHtml(String.format(CORE_TEMPLATE,getText()))); } public JustifiedTextView(Context context) { super(context); setText(Html.fromHtml(String.format(CORE_TEMPLATE,getText()))); } public JustifiedTextView(Context context, AttributeSet attrs) { super(context, attrs); setText(Html.fromHtml(String.format(CORE_TEMPLATE,getText()))); } } 

插入xml示例

  <domo.suichbt.util.JustifiedTextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/sw_titulo" android:singleLine="false"> </domo.suichbt.util.JustifiedTextView> 

只需三个步骤,您就可以certificate您的网页浏览文本。

1)

 // Justify tag String justifyTag = "<html><body style='text-align:justify;'>%s</body></html>"; 

2)

 // Concatenate your string with the tag to Justify it String dataString = String.format(Locale.US, justifyTag, "my html with text justification"); 

3)

 // Load the data in the web view webView.loadDataWithBaseURL("", dataString, "text/html", "UTF-8", "");