66 votes

Comment supprimer l'espace supérieur et inférieur sur textview d'Android

Lorsque j'inclus les XML ci-dessous dans le fichier de mise en page, je peux voir l'image ci-dessous. Si vous le voyez, vous pouvez vous rendre compte que le TextView a un espace supérieur et inférieur.

 <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="E1"
android:background="#ff00ff00"/>

entrez la description de l'image ici

Je souhaite supprimer l'espace. Comment l'enlever ? Ça s'appelle comment? Si quelqu'un a une idée... merci de me le faire savoir. Merci d'avance.

98voto

Graham Borland Points 27556

Essayez android:includeFontPadding="false" pour voir si cela aide. D'après mon expérience, cela aidera un peu, mais il n'y a aucun moyen de réduire les dimensions de TextView à la taille de texte exacte au pixel près.

La seule alternative, qui peut ou non donner de meilleurs résultats, est de tricher un peu et de câbler les dimensions pour qu'elles correspondent à la taille du texte, par exemple "24sp" au lieu de "wrap_content" pour la hauteur .

30voto

Anton Points 500

J'ai eu le même problème. L'attribut android:includeFontPadding="false" ne fonctionne pas pour moi. J'ai résolu ce problème de cette façon :

 public class TextViewWithoutPaddings extends TextView {

    private final Paint mPaint = new Paint();

    private final Rect mBounds = new Rect();

    public TextViewWithoutPaddings(Context context) {
        super(context);
    }

    public TextViewWithoutPaddings(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public TextViewWithoutPaddings(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onDraw(@NonNull Canvas canvas) {
        final String text = calculateTextParams();

        final int left = mBounds.left;
        final int bottom = mBounds.bottom;
        mBounds.offset(-mBounds.left, -mBounds.top);
        mPaint.setAntiAlias(true);
        mPaint.setColor(getCurrentTextColor());
        canvas.drawText(text, -left, mBounds.bottom - bottom, mPaint);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        calculateTextParams();
        setMeasuredDimension(mBounds.width() + 1, -mBounds.top + 1);
    }

    private String calculateTextParams() {
        final String text = getText().toString();
        final int textLength = text.length();
        mPaint.setTextSize(getTextSize());
        mPaint.getTextBounds(text, 0, textLength, mBounds);
        if (textLength == 0) {
            mBounds.right = mBounds.left;
        }
        return text;
    }
}

24voto

j2emanue Points 3456

android:includeFontPadding="false" est assez bon mais il ne l'obtient pas précisément. Parfois, vous voulez une précision de ligne de bordure afin que vous puissiez le découvrir vous-même en appliquant des marges négatives :

essayez de définir vos marges inférieure et supérieure sur une valeur négative.

quelque chose comme ça:

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

ajustez les valeurs en conséquence.

5voto

Henrique Sousa Points 363

C'est le code qui a sauvé notre journée. Il a été adapté en utilisant le code mono C# de maksimko :

 public class TopAlignedTextView extends TextView {

    public TopAlignedTextView(Context context) {
        super(context);
    }

    /*This is where the magic happens*/
    @Override
    protected void onDraw(Canvas canvas){

        float offset = getTextSize() - getLineHeight();
        canvas.translate(0, offset);
        super.onDraw(canvas);
    }
}

Encore fallait-il jouer avec textView.setIncludeFontPadding(false) parce que nous alignions TextViews avec différentes tailles de police.

4voto

maksimko Points 31

J'ai rencontré le même problème. Voici une bonne réponse : Comment aligner le texte en haut de TextView ?

Mais le code est peu inachevé et ne prend pas en charge toutes les tailles de police. Changer de ligne

 int additionalPadding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getContext().getResources().getDisplayMetrics());

à

 int additionalPadding = getTextSize() - getLineHeight();

Le code C# complet (mono) supprime le décalage supérieur :

 public class TextControl : TextView {
    public TextControl (Context context) : base (context)
    {
        SetIncludeFontPadding (false);
        Gravity = GravityFlags.Top;
    }

    protected override void OnDraw (Android.Graphics.Canvas canvas)
    {
        if (base.Layout == null)
            return;

        Paint.Color = new Android.Graphics.Color (CurrentTextColor);
        Paint.DrawableState = GetDrawableState ();

        canvas.Save ();

        var offset = TextSize - LineHeight;
        canvas.Translate (0, offset);

        base.Layout.Draw (canvas);

        canvas.Restore ();
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X