Android: TextView: Supprimer l'espacement et le rembourrage sur le haut et le bas

Quand j'ai un TextView avec un n dans le texte, sur la droite, j'ai deux singleLine TextView s, l'une en dessous de l'autre, sans espace entre les deux. J'ai établi ce qui suit pour les trois TextView s.

 android:lineSpacingMultiplier="1" android:lineSpacingExtra="0pt" android:paddingTop="0pt" android:paddingBottom="0pt"

la première ligne de la gauche TextView s'aligne parfaitement avec le haut à droite TextView . La deuxième ligne de la gauche TextView est un peu plus haute que la deuxième ligne de la droite inférieure TextView .

il semble qu'il y ait une sorte de rembourrage caché sur le haut et le bas du TextView s. Comment je peux enlever ça?

138
demandé sur George Bailey 2011-01-22 18:38:17

14 réponses

setIncludeFontPadding (boolean includepad)

ou en XML ce serait:

android:includeFontPadding="false"

indiquer si le TextView comprend un rembourrage supérieur et inférieur pour faire place aux accents qui dépassent la montée et la descente normales. La valeur par défaut est true.

396
répondu user634545 2015-10-13 09:47:45

je sens ta douleur. J'ai essayé toutes les réponses ci-dessus, y compris le setIncludeFontPadding à false, qui n'a rien fait pour moi.

ma solution? layout_marginBottom="-3dp" sur le TextView vous donne une solution pour le fond, BAM!

bien que,- 3dp sur layout_marginTop échoue....ugh.

33
répondu hunterp 2015-09-07 10:43:05

j'ai cherché beaucoup de réponse correcte mais non où je pouvais trouver une réponse qui pourrait exactement enlever tout le rembourrage du TextView , mais finalement après avoir passé par le doc officiel obtenu un travail autour de textes de ligne simple

android:includeFontPadding="false"
android:lineSpacingExtra="0dp"

ajouter ces deux lignes à TextView xml fera le travail.

Premier attribut supprime le capitonnage réservé aux accents et second attribut supprime l'espacement réservés à maintenir un espace entre deux lignes de texte.

assurez-vous de ne pas ajouter lineSpacingExtra="0dp" dans multiline TextView car cela pourrait rendre l'apparence maladroite

22
répondu Mohammed Atif 2017-10-23 06:33:30

cela m'agaçait aussi, et la réponse que j'ai trouvée était qu'il y avait en fait de l'espace supplémentaire dans la police elle-même, pas dans le TextView. Il est plutôt irritant, venant d'un contexte de publication de documents, la quantité limitée de contrôle que vous avez avec Android sur les éléments typographiques. Je recommande l'utilisation d'une police de caractères personnalisée (comme Bitstream Vera Sans, qui est autorisé pour la redistribution) qui peut ne pas avoir ce problème. Je ne suis pas sûr, en particulier, si ou pas il ne, cependant.

7
répondu kcoppock 2011-01-22 18:48:42
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/baselineImage"
        android:includeFontPadding="false" />

    <ImageView
        android:id="@+id/baselineImage"
        android:layout_width="1dp"
        android:layout_height="1dp"
        android:baselineAlignBottom="true"
        android:layout_alignParentBottom="true" />

    <!-- This view will be exactly 10dp below the baseline of textView -->
    <View
        android:id="@+id/view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_below="@+id/baselineImage" />

</RelativeLayout>

avec un ImageView supplémentaire, nous pouvons définir le TextView pour être aligné avec L'ImageView et définir le android:baselineAlignBottom sur L'ImageView à true, ce qui fera de la baseline D'ImageView une baseline. D'autres vues peuvent s'aligner en utilisant le bas de L'ImageView qui lui-même est la même que la ligne de base de TextView.

cela ne fixe toutefois que le bas du rembourrage et non le haut.

3
répondu Viven 2016-03-08 10:17:06

je pense que ce problème peut être résolu de cette façon:

 <TextView
        android:id="@+id/leftText"
        android:includeFontPadding="false"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30dp"
        android:text="Hello World!\nhello world" />

 <TextView
        android:id="@+id/rightUpperText"
        android:includeFontPadding="false"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/leftText"
        android:layout_alignTop="@+id/leftText"
        android:textSize="30dp"
        android:text="Hello World!" />

 <TextView
        android:id="@+id/rightLowerText"
        android:includeFontPadding="false"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/leftText"
        android:layout_below="@+id/rightUpperText"
        android:textSize="30dp"
        android:text="hello world" />

ce sont les résultats:

Capture d'écran-1

Capture d'écran de 3", 151970920"

bien que la ligne de caractères spéciaux dans le texte de droite semble un peu plus haut que la deuxième ligne du texte de gauche, leurs lignes de base sont encore alignées.

3
répondu Wei Wei 2017-03-06 03:40:26

je supprime l'espacement dans ma vue personnalisée -- NoPaddingTextView.

https://github.com/SenhLinsh/NoPaddingTextView

enter image description here

package com.linsh.nopaddingtextview;

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.widget.TextView;

/**
 * Created by Senh Linsh on 17/3/27.
 */

public class NoPaddingTextView extends TextView {

    private int mAdditionalPadding;

    public NoPaddingTextView(Context context) {
        super(context);
        init();
    }


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

    private void init() {
        setIncludeFontPadding(false);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        int yOff = -mAdditionalPadding / 6;
        canvas.translate(0, yOff);
        super.onDraw(canvas);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        getAdditionalPadding();

        int mode = MeasureSpec.getMode(heightMeasureSpec);
        if (mode != MeasureSpec.EXACTLY) {
            int measureHeight = measureHeight(getText().toString(), widthMeasureSpec);

            int height = measureHeight - mAdditionalPadding;
            height += getPaddingTop() + getPaddingBottom();
            heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    private int measureHeight(String text, int widthMeasureSpec) {
        float textSize = getTextSize();

        TextView textView = new TextView(getContext());
        textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
        textView.setText(text);
        textView.measure(widthMeasureSpec, 0);
        return textView.getMeasuredHeight();
    }

    private int getAdditionalPadding() {
        float textSize = getTextSize();

        TextView textView = new TextView(getContext());
        textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
        textView.setLines(1);
        textView.measure(0, 0);
        int measuredHeight = textView.getMeasuredHeight();
        if (measuredHeight - textSize > 0) {
            mAdditionalPadding = (int) (measuredHeight - textSize);
            Log.v("NoPaddingTextView", "onMeasure: height=" + measuredHeight + " textSize=" + textSize + " mAdditionalPadding=" + mAdditionalPadding);
        }
        return mAdditionalPadding;
    }
}
3
répondu Linsh 2017-03-29 02:10:18

puisque mon exigence est de remplacer le textView existant obtenir de findViewById(getResources().getIdentifier("xxx", "id", "android")); , donc je ne peux pas simplement essayer onDraw() d'autre réponse.

mais je viens de comprendre les étapes correctes pour résoudre mon problème, voici le résultat final de L'inspecteur de mise en page:

enter image description here

puisque ce que je voulais est simplement supprimer les espaces supérieurs, donc je n'ai pas à choisir une autre police pour supprimer fond espaces.

voici le code critique pour le corriger:

Typeface mfont = Typeface.createFromAsset(getResources().getAssets(), "fonts/myCustomFont.otf");
myTextView.setTypeface(mfont);

myTextView.setPadding(0, 0, 0, 0);

myTextView.setIncludeFontPadding(false);

la première clé est la police personnalisée" fonts/myCustomFont.otf" qui a l'espace en bas mais pas sur le haut, vous pouvez facilement comprendre cela par ouvrir le fichier otf et cliquez sur n'importe quelle police dans android Studio:

enter image description here

comme vous pouvez le voir, le curseur sur le bas a un espacement supplémentaire mais pas sur le haut, de sorte qu'il fixe mon problème.

la seconde clé est vous ne pouvez pas simplement sauter n'importe lequel du code , sinon il pourrait ne pas fonctionne. C'est la raison pour laquelle vous pouvez trouver certaines personnes commentent qu'une réponse fonctionne et d'autres personnes commentent que cela ne fonctionne pas.

illustrons ce qui se passera si je retire l'un d'eux.

sans setTypeface(mfont); :

enter image description here

sans setPadding(0, 0, 0, 0); :

enter image description here

sans setIncludeFontPadding(false); :

enter image description here

Sans 3 d'entre eux (c.-à-d. l'original):

enter image description here

1
répondu 林果皞 2017-11-02 14:19:23

méthode Simple travaillée:

setSingleLine();
setIncludeFontPadding(false);

si cela n'a pas fonctionné, essayez d'ajouter ceci au-dessus de ce code:

setLineSpacing(0f,0f);
// and set padding and margin to 0

si vous avez besoin de plusieurs lignes, peut-être que vous aurez besoin de calculer exactement la hauteur de rembourrage haut et bas via TextView ligne simple temporaire (avant et après enlever le rembourrage), puis appliquer le résultat de diminution de hauteur avec un rembourrage négatif ou une certaine disposition fantôme avec traduire Y. Lol

1
répondu phnghue 2018-09-02 03:57:01

vous pourriez essayer d'aligner le bas de la vue de texte de gauche avec le bas de la vue de texte de droite 2nd.

0
répondu Jems 2011-01-22 15:44:16

À ma connaissance, c'est inhérent à la plupart des widgets et la quantité de "rembourrage" diffère entre les fabricants de téléphones. Ce rembourrage est en fait un espace blanc entre la bordure de l'image et l'image dans le fichier image 9 patch.

par exemple sur mon Droid X, les widgets spinner obtiennent un espace blanc supplémentaire que les boutons, ce qui le rend maladroit quand vous avez un spinner en ligne avec un bouton, mais sur le téléphone de ma femme la même application n'a pas le même problème et regarde grand!

la seule suggestion que j'aurais est de créer vos propres 9 fichiers correctifs et de les utiliser dans votre application.

Ahhh les douleurs qui sont Androïde.

Édité: Clarifier rembourrage vs espace blanc.

0
répondu user432209 2011-01-22 16:16:06

utilisation simple

android:padding="0dp"
0
répondu Juan Bernal 2018-05-15 00:55:36

seule chose qui a fonctionné est

android:lineSpacingExtra="-8dp"
0
répondu Antonis Radz 2018-09-20 06:27:33

voir ceci:

aligner ImageView avec EditText horizontalement

il semble que L'image d'arrière-plan D'EditText ait quelques pixels transparents qui ajoutent aussi du rembourrage.

une solution est de changer L'arrière-plan par défaut D'EditText en quelque chose d'autre (ou Rien, mais aucun arrière-plan pour un EditText N'est probablement pas acceptable). Cela peut être fait en définissant l'attribut android:background XML.

android:background="@drawable/myEditBackground"
-1
répondu Ixx 2017-05-23 12:02:51