在TextView中对齐文本

8

我的应用程序首先有一个文本视图来显示文本。然后我想使文本对齐,但在Android中,无法在文本视图中实现文本对齐。为了使文本对齐,我正在从此链接获取帮助。我正在遵循@Kondzio提供的答案,但它不起作用。我不知道我的代码哪里出了问题。

代码-

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-

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

在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> 

我将scrollbarenabled设置为true来使我的文本可以进行垂直滚动。


尝试使用这个类 https://github.com/bluejamesbond/TextJustify-Android - Hariharan
7个回答

8

// 使用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");

编辑:或者在你的代码中添加反斜杠

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

我需要把这段代码添加在哪里?我需要对上面的代码进行什么修改? - John R
我需要创建样式和颜色吗? - John R
1
@JohnR 我不是魔术师,看不到你在那里做什么。请分享你的代码或日志。 - Padma Kumar
我已经解决了错误,但TextView覆盖了整个屏幕。LinearLayout中的权重对其没有影响。如何解决这个问题? - John R
将 android:layout_width="fill_parent" 移除,并将其更改为 300dp。 - Padma Kumar
显示剩余5条评论

6
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';
    }
}

}

我修改了Sasikumar提供的代码,以纠正以下问题:

  1. 如果 lineCount() 为1,则不要调整(它本来是这样做的)
  2. 如果是 lastLine,请勿对其进行调整(它超出了调整范围)

这是一个纯文本解决方案。Html无效,没有换行符(\n)或任何其他字符有效。所有空格都被删除。因此,它只适用于有限且纯文本的用途。


5
请使用此依赖项以使用 justifytext 库。
compile 'com.uncopt:android.justified:1.0'

同步Gradle

为了在TextView中使文本居中,可以在你的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"/>

然后在Java类中使用:

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

1
加载大文本太慢了。 - Samsung Developer
1
非常缓慢的库 - ihojose

1
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>

0

首先创建一个新的类JustifyTextView.java,它可以将文本视图中的文本居中对齐。下面附上完整的代码:

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';
    }
}

 }

然后进入您的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"
       />

0

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

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

}  

你可以像这样使用它:
    JustifiedTextView myMsg = new JustifiedTextView(this);
    myMsg.setText(msg);

如果你的文本视图在xml中,就像这样进行编辑:

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

在你的代码中这样做:
    JustifiedTextView myMsg = (JustifiedTextView)findViewById(R.id.t1);
    myMsg.setText("text"); 

跟随@Simon的答案,将该构造函数添加到JustifiedTextView.java类中。 - Sayed Jalil Hassan
我想使用不同的xml为不同的屏幕大小设置字体大小。如果我使用webview,它需要几秒钟才能显示文本。我希望立即显示文本。所以我想用textview来实现这个功能。http://stackoverflow.com/questions/21202560/justify-text-in-textview-not-working-properly - John R

0

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

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

@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");
}

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