web-dev-qa-db-fra.com

Comment aligner le texte en haut de TextView?

Comment aligner le texte en haut d'une TextView?
Équivalent Android API pour Swings setInsets ()?
qui est en haut du texte doit commencer à être dans (0,0) de TextView

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent" 
    Android:layout_height="fill_parent" 
    Android:orientation="vertical">

    <TextView 
        Android:id="@+id/text1" 
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content" 
        Android:text="TextView" 
        Android:textSize="42sp" 
        Android:paddingTop="0px" 
        Android:gravity="top">
    </TextView> 
</LinearLayout> 

J'ai utilisé l'extrait ci-dessus, mais la sortie n'est toujours pas celle attendue
Des idées?

39

Ainsi, l'espace en haut de TextView est un remplissage utilisé pour les caractères en dehors de la langue anglaise tels que les accents. Pour supprimer cet espace, vous pouvez définir l'attribut Android:includeFontPadding Sur false dans votre XML ou vous pouvez le faire par programmation avec la fonction setIncludeFontPadding(false).

Regardez le documentation SDK pour TextView si cela n'est toujours pas clair.

RÉPONSE MODIFIÉE
Si la définition de l'attribut Android:includeFontPadding N'accomplit pas ce que vous essayez de faire, l'autre solution consiste à remplacer la méthode onDraw(Canvas canvas) du TextView que vous utilisez afin qu'il élimine le remplissage supérieur supplémentaire que Android ajoute à chaque TextView. Après avoir écrit ma réponse d'origine, j'ai remarqué que, pour une raison quelconque, TextView inclut un remplissage supplémentaire en plus du remplissage de police. Suppression du remplissage de police ainsi que ce remplissage supplémentaire aligne parfaitement le texte en haut de TextView. Regardez l'extrait de code ci-dessous.

public class TopAlignedTextView extends TextView {

    // Default constructor when inflating from XML file
    public TopAlignedTextView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    // Default constructor override
    public TopAlignedTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs);
        setIncludeFontPadding(false); //remove the font padding
        setGravity(getGravity() | Gravity.TOP); //make sure that the gravity is set to the top
    }

    /*This is where the magic happens*/
    @Override
    protected void onDraw(Canvas canvas){
        TextPaint textPaint = getPaint(); 
        textPaint.setColor(getCurrentTextColor());
        textPaint.drawableState = getDrawableState();
        canvas.save();

        //converts 5dip into pixels            
        int additionalPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getContext().getResources().getDisplayMetrics());

        //subtracts the additional padding from the top of the canvas that textview draws to in order to align it with the top.            
        canvas.translate(0, -additionalPadding);
        if(getLayout() != null)
            getLayout().draw(canvas);
        canvas.restore();
    }
} 
66
Kachi

La police elle-même a des espaces supplémentaires en haut et en bas, je crois.

Habituellement, je donne à la vue des marges négatives. Le problème est que cela semble mauvais lorsque les appareils sont livrés avec des polices différentes.

Android:layout_marginTop="-5dp"
Android:layout_marginBottom="-5dp"

Vous devrez ajuster en fonction de la taille du texte, les plus grandes tailles de texte nécessitent plus de remplissage négatif.

18
Ryan

Dans votre .xml, écrivez cela:

Android:gravity="center|top"

Le premier "centre" aligne votre ligne horizontalement au centre et le suivant "haut" s'aligne verticalement vers le haut.

16
Terranology

Possible, vous n'avez pas besoin de rendre votre vue basée sur TextView. Essayez d'étendre View et écrivez votre texte dans onDraw().

Regardez ici: https://stackoverflow.com/a/32081250/1263771

2
tse

Je pense que votre extrait de code a raison. Je suppose que vous êtes gêné par quelques pixels entre le haut de la lettre "T" et le bord supérieur du TextView? Cet espace est nécessaire pour rendre certaines lettres qui ne sont pas présentes dans l'alphabet anglais.

Vérifiez que les liens vous donnent une idée:

1
alex2k8

Je ne sais pas si je comprends ce que vous voulez dire, mais le texte à l'intérieur de la vue de texte va être aligné en haut si vous utilisez gravity = top sur la vue de texte.

Si vous mettez une couleur d'arrière-plan sur votre affichage de texte, vous pourriez mieux voir ce qui se passe ...

Je suppose que votre problème est que la vue textuelle est centrée car vous utilisez fill_parent à la fois sur la hauteur et la largeur du parent LinearLayout. La vue textuelle semble être le seul enfant, alors essayez de mettre gravity = top sur le LinearLayout ...

C'est la seule chose à laquelle je pouvais penser ...

0
Vidar Vestnes