Dans mon application, j'ai d'abord textview pour afficher le texte. Ensuite, je veux justifier le texte, mais sous Android, il n'est pas possible de justifier le texte dans textview. Pour justifier le texte je prends l'aide de ce lien . Je suis la réponse fournie par @Kondzio mais ça ne marche pas. Je ne sais pas ce qui ne va pas dans mon 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>
Dans 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>
Je règle scrollbarenabled sur true pour faire défiler verticalement mon texte.
// conversion de tout le contenu de la langue pour justifier l'utilisation de balises 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: Ou Changez votre code avec une barre oblique inverse
<body style=\"text-align:justify;color:gray;background-color:black;\">
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';
}
}
}
J'ai modifié le code donné par Sasikumar pour corriger les points suivants.
C'est une solution purement textuelle. Html ne fonctionne pas. aucun saut de ligne (\ n) ni aucun autre caractère ne fonctionne. Tous les espaces sont supprimés. Donc, c'est juste pour une utilisation limitée et pure de texte.
utiliser cette dépendance pour la bibliothèque de Justtext
compile 'com.uncopt:Android.justified:1.0'
et synchro gradle
Pour justifier le texte en affichage texte, utilisez ceci dans votre 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"/>
et l'utiliser dans la classe Java:
JustifiedTextView myMsg = (JustifiedTextView)findViewById(R.id.t1);
myMsg.setText("ur text data for justify");
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>
Copiez la classe suivante dans votre projet et développez votre textview à partir de ceci:
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();
}
}
Vous pouvez l'utiliser comme ceci:
JustifiedTextView myMsg = new JustifiedTextView(this);
myMsg.setText(msg);
Si votre vue texte est au format XML, modifiez-la comme suit:
<com.whatever.JustifiedTextView <!--path to the JustifiedTextView.Java -->
Android:id="@+id=t1">
</JustifiedTextView>
Le faire dans votre code:
JustifiedTextView myMsg = (JustifiedTextView)findViewById(R.id.t1);
myMsg.setText("text");
Comment justifier un texte sur Android sans utiliser aucune bibliothèque Voir plus de code .
Créez une activité et collez le code suivant Voir plus
@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");
}
tout d'abord créer une nouvelle classe JustifyTextView.Java son alignement le texte TextView au centre. Je suis attaché code complet ci-dessous
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';
}
}
}
Puis allez dans votre code xml remplacez votre textview par ce 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"
/>