Justify text in textview

2019-01-22 04:32发布

问题:

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.

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-

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

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

回答1:

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

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;\">


回答2:

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.

  1. If lineCount() is 1, do not justify. (It was doing so)
  2. if lastLine, do not justify it. (it was going beyond justification)

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.



回答3:

use this dependency for justifytext library

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

and sync gradle

To justify text in text view, use this in your 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:

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


回答4:

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>


回答5:

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

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:

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


回答6:

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

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

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


回答7:

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

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