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