web-dev-qa-db-fra.com

Justifier le texte dans textview

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.

7
John R

// 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;\">
7
Padma Kumar
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.

  1. Si lineCount () est égal à 1, ne justifiez pas. (C'était le cas)
  2. si lastLine, ne le justifiez pas. (ça allait au-delà de la justification)

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.

6
rajesh

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");
6
shweta jariya
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>
1
M.Ganji

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"); 
0
Sayed Jalil Hassan

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

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