Android 在 textview 中对齐文本

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/21178571/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 04:06:02  来源:igfitidea点击:

Justify text in textview

androidscrolltextview

提问by John R

In my app first I have textview to show text. Then I want to justify text but in android its not possible to justify text in textview. To justify text I am taking help from this link. I am following the answer provided by @Kondzio but its not working. I dont know whats wrong in my code.

在我的应用程序中,我首先使用 textview 来显示文本。然后我想对齐文本,但在 android 中它不可能在 textview 中对齐文本。为了证明文本的合理性,我正在从这个链接获得帮助。我正在关注@Kondzio 提供的答案,但它不起作用。我不知道我的代码有什么问题。

Code-

代码-

public class Benefits extends Activity{
    private Button back;
    LinearLayout bText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.benefits);
        WebView view = new WebView(this);
        view.setVerticalScrollBarEnabled(true);
        ((LinearLayout)findViewById(R.id.bText)).addView(view);
        view.loadData(getString(R.string.benef), "text/html", "utf-8");

        back.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v)
        {
            finish();
        }
    });
  }
}

Xml-

xml-

<LinearLayout 
       android:id="@+id/bText"
       android:orientation="horizontal"
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content"
       android:layout_weight="4"
       android:gravity="center">            
 </LinearLayout>

In strings.xml-

在strings.xml-

<string name="benef">
        <![CDATA[
        <html>
        <head></head>
        <body style="text-align:justify;color:gray;background-color:black;">
         "1.some text\n
          2.some text\n
          .............
 </body>
</html>
]]>
</string> 

I am setting scrollbarenabled to true to make vertical scrolling on my text.

我将 scrollbarenabled 设置为 true 以在我的文本上进行垂直滚动。

采纳答案by Padma Kumar

// converting all the language content to justify using html tags.

// 将所有语言内容转换为使用 html 标签对齐。

String youtContentStr = String.valueOf(Html
                .fromHtml("<![CDATA[<body style=\"text-align:justify;color:#222222; \">"
                            + getResources().getString(R.string.passthe_content)
                            + "</body>]]>"));

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

EDIT:or change your code with added back slash

编辑:或使用添加反斜杠更改您的代码

<body style=\"text-align:justify;color:gray;background-color:black;\">

回答by rajesh

import android.content.Context;
import android.graphics.Canvas;
import android.text.Layout;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.widget.TextView;


public class JustifyTextView extends TextView {

private int mLineY;
private int mViewWidth;

public JustifyTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    super.onLayout(changed, left, top, right, bottom);
}

@Override
protected void onDraw(Canvas canvas) {
    TextPaint paint = getPaint();
    paint.setColor(getCurrentTextColor());
    paint.drawableState = getDrawableState();
    mViewWidth = getMeasuredWidth();
    String text = getText().toString();
    mLineY = 0;
    mLineY += getTextSize();
    Layout layout = getLayout();
    for (int i = 0; i < layout.getLineCount(); i++) {
        int lineStart = layout.getLineStart(i);
        int lineEnd = layout.getLineEnd(i);
        String line = text.substring(lineStart, lineEnd);

        float width = StaticLayout.getDesiredWidth(text, lineStart, lineEnd, getPaint());
        if (needScale(line,i)) {
            drawScaledText(canvas, lineStart, line, width);
        } else {
            canvas.drawText(line, 0, mLineY, paint);
        }

        mLineY += getLineHeight();
    }
}

private void drawScaledText(Canvas canvas, int lineStart, String line, float lineWidth) {
    float x = 0;
    if (isFirstLineOfParagraph(lineStart, line)) {
        String blanks = "  ";
        canvas.drawText(blanks, x, mLineY, getPaint());
        float bw = StaticLayout.getDesiredWidth(blanks, getPaint());
        x += bw;

        line = line.substring(3);
    }

    float d = (mViewWidth - lineWidth) / line.length() - 1;
    for (int i = 0; i < line.length(); i++) {
        String c = String.valueOf(line.charAt(i));
        float cw = StaticLayout.getDesiredWidth(c, getPaint());
        canvas.drawText(c, x, mLineY, getPaint());
        x += cw + d;
    }
}

private boolean isFirstLineOfParagraph(int lineStart, String line) {
    return line.length() > 3 && line.charAt(0) == ' ' && line.charAt(1) == ' ';
}

private boolean needScale(String line,int lineNumber) {
    Layout layout = getLayout();
    if (line.length() == 0 || layout.getLineCount() == 1 || lineNumber == (layout.getLineCount() - 1)) {
        return false;
    } else {
        return line.charAt(line.length() - 1) != '\n';
    }
}

}

I modified code given by Sasikumar to correct followings.

我修改了 Sasikumar 给出的代码以更正以下内容。

  1. If lineCount() is 1, do not justify. (It was doing so)
  2. if lastLine, do not justify it. (it was going beyond justification)
  1. 如果 lineCount() 为 1,则不进行调整。(原来是这样做的)
  2. 如果 lastLine,不要证明它是合理的。(这超出了正当性)

This is pure text only solution. Html does not work. no linebreak (\n) or any other character works. All spaces are removed. So its just for limited , pure text use.

这是纯文本解决方案。Html 不起作用。没有换行符 (\n) 或任何其他字符有效。所有空格都被删除。所以它仅用于有限的纯文本使用。

回答by shweta jariya

use this dependency for justifytext library

将此依赖项用于 justifytext 库

compile 'com.uncopt:android.justified:1.0'

and sync gradle

并同步gradle

To justify text in text view, use this in your XML:

要在文本视图中对齐文本,请在您的 XML 中使用它:

<com.uncopt.android.widget.text.justify.JustifiedTextView
    android:layout_width="match_parent"
    android:id="@+id/t1"
    android:padding="5dp"
    android:textColor="#303336"
    android:textSize="18sp"
    android:layout_height="wrap_content"/>

and use this in the Java class:

并在 Java 类中使用它:

JustifiedTextView myMsg = (JustifiedTextView)findViewById(R.id.t1);
myMsg.setText("ur text data for justify");

回答by M.Ganji

public class Main extends Activity {

WebView webView;

 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);

 webView = (WebView) findViewById(R.id.webview); 

 String text = "<html><body>"
 + "<p align=\"justify\">" 
 + getString(R.string.lorem_ipsum) 
 + "</p> "
 + "</body></html>";

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

main


main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<WebView
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
 </RelativeLayout>

回答by sasikumar

first Create new class JustifyTextView.java its alignment the Textview text in center. Am attached full code below

首先创建新类 JustifyTextView.java 其对齐 Textview 文本在中心。下面附上完整的代码

your pakagename;
 import android.content.Context;
 import android.graphics.Canvas;
 import android.text.Layout;
 import android.text.StaticLayout;
 import android.text.TextPaint;
 import android.util.AttributeSet;
 import android.widget.TextView;


public class JustifyTextView extends TextView {

private int mLineY;
private int mViewWidth;

public JustifyTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    super.onLayout(changed, left, top, right, bottom);
}

@Override
protected void onDraw(Canvas canvas) {
    TextPaint paint = getPaint();
    paint.setColor(getCurrentTextColor());
    paint.drawableState = getDrawableState();
    mViewWidth = getMeasuredWidth();
    String text = (String) getText();
    mLineY = 0;
    mLineY += getTextSize();
    Layout layout = getLayout();
    for (int i = 0; i < layout.getLineCount(); i++) {
        int lineStart = layout.getLineStart(i);
        int lineEnd = layout.getLineEnd(i);
        String line = text.substring(lineStart, lineEnd);

        float width = StaticLayout.getDesiredWidth(text, lineStart, lineEnd, getPaint());
        if (needScale(line)) {
            drawScaledText(canvas, lineStart, line, width);
        } else {
            canvas.drawText(line, 0, mLineY, paint);
        }

        mLineY += getLineHeight();
    }
}

private void drawScaledText(Canvas canvas, int lineStart, String line, float lineWidth) {
    float x = 0;
    if (isFirstLineOfParagraph(lineStart, line)) {
        String blanks = "  ";
        canvas.drawText(blanks, x, mLineY, getPaint());
        float bw = StaticLayout.getDesiredWidth(blanks, getPaint());
        x += bw;

        line = line.substring(3);
    }

    float d = (mViewWidth - lineWidth) / line.length() - 1;
    for (int i = 0; i < line.length(); i++) {
        String c = String.valueOf(line.charAt(i));
        float cw = StaticLayout.getDesiredWidth(c, getPaint());
        canvas.drawText(c, x, mLineY, getPaint());
        x += cw + d;
    }
}

private boolean isFirstLineOfParagraph(int lineStart, String line) {
    return line.length() > 3 && line.charAt(0) == ' ' && line.charAt(1) == ' ';
}

private boolean needScale(String line) {
    if (line.length() == 0) {
        return false;
    } else {
        return line.charAt(line.length() - 1) != '\n';
    }
}

 }

Then go to your xml code replace your textview by this code

然后去你的xml代码用这个代码替换你的textview

    <your package.JustifyTextView

        android:id="@+id/Textview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"           
        android:textAppearance="?android:attr/textAppearanceSmall"           
        android:lineSpacingMultiplier="1.1"           
        android:text="hai hello how"
       />

回答by Sayed Jalil Hassan

Copy the following class to your project and extend your textview from this:

将以下类复制到您的项目中并从此扩展您的 textview:

JustifiedTextView.java:

JustifiedTextView.java

    import android.annotation.SuppressLint;
    import android.content.Context;
    import android.graphics.Color;
    import android.text.SpannableString;
    import android.webkit.WebChromeClient;
    import android.webkit.WebView;


    public class JustifiedTextView extends WebView {

       private String core = "<html><body style='text-align:justify;color:rgba(%s);font-size:%dpx;margin: 10px 10px 10px 10px;'>%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) {
        super(context);
        this.setWebChromeClient(new WebChromeClient() {

        });

    }

    public void setText(String s) {
        this.text = s;
        // this.setPadding(10, 10, 10, 10);
        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();
    }

}  

You can use it like this:

你可以这样使用它:

    JustifiedTextView myMsg = new JustifiedTextView(this);
    myMsg.setText(msg);

If your text view is in xml, edit it like this:

如果您的文本视图在 xml 中,请像这样编辑它:

    <com.whatever.JustifiedTextView  <!--path to the JustifiedTextView.java -->
      android:id="@+id=t1">
    </JustifiedTextView> 

The do this in your code:

在您的代码中执行此操作:

    JustifiedTextView myMsg = (JustifiedTextView)findViewById(R.id.t1);
    myMsg.setText("text"); 

回答by Narendra Yadav

How to justify text in Android without using any Library See More code.

如何在不使用任何库的情况下在 Android 中对齐文本查看更多代码

Create a activity and paste following code See More

创建一个活动并粘贴以下代码查看更多

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
   WebView webView= (WebView) findViewById(R.id.webView);
   WebSettings  webSettings=webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    String htmlText = " %s ";
    String myData = "<html><body style=\"text-align:justify\">The E-Learning Application is a Mobile based application.
        The main objective of this application is to make it interactive 
    and its ease of use.The main features that the application provides are 
    online tutorial and tests, once the registered people select their 
    interested subjects. <br/>
This helps to establish incremental learning process. Users can also 
discuss an issue/topic by posting messages in the discussion forum.
          Along with this they can also take real time simulations of the most 
        widely known competitive exams.</body></Html>";

    webView.loadData(String.format(htmlText,myData),"text/html","utf-8");
}