Как убрать верхний и нижний пробел в текстовом представлении Android - PullRequest
59 голосов
/ 06 июля 2011

Когда я включаю приведенный ниже файл XML - макет , я вижу изображение ниже.Если вы видите это, вы можете понять, что TextView имеет верхнее и нижнее пространство.

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

enter image description here

Я хочу удалить пробел.Как это убрать?Как это называется?Если у кого-то есть подсказка .. пожалуйста, дайте мне знать.Заранее спасибо.

Ответы [ 13 ]

86 голосов
/ 06 июля 2011

Попробуйте android:includeFontPadding="false", чтобы увидеть, помогает ли это. По моему опыту, это немного поможет, но нет способа уменьшить размеры TextView до точного пиксельного размера текста.

Единственная альтернатива, которая может дать, а может и не дать лучших результатов, - это немного обмануть и жестко привязать размеры к размеру текста, например. "24sp" вместо "wrap_content" для высоты.

20 голосов
/ 26 августа 2014

android:includeFontPadding="false" довольно хорошо, но не совсем точно. иногда вам нужна точность границы, чтобы вы могли сами разобраться, применяя отрицательные поля:

попробуйте установить отрицательное значение нижней и верхней полей.

как то так:

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

настроить значения соответственно.

19 голосов
/ 29 сентября 2015

У меня была такая же проблема. Атрибут android:includeFontPadding="false" у меня не работает. Я решил эту проблему следующим образом:

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;
    }
}
4 голосов
/ 25 октября 2014

Это код, который спас наш день. Он был адаптирован с использованием моно кода C # Максим :

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);
    }
}

Все равно пришлось поиграться с textView.setIncludeFontPadding(false), потому что мы выравнивали TextViews с разными размерами шрифта.

4 голосов
/ 13 июля 2013

Я столкнулся с той же проблемой. Вот хороший ответ: Как выровнять текст по верху TextView?

Но код немного незавершен и не поддерживает все размеры шрифтов. Изменить строку

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

до

int additionalPadding = getTextSize() - getLineHeight();

Полный код C # (моно) удаляет верхнее смещение:

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 ();
    }
}
3 голосов
/ 06 июля 2011

Просто хотел добавить к DynamicMind в ответ , что причина, по которой вы видите интервалы вокруг ваших TextViews, заключается в заполнении фонов из 9 патчей , которые они используют для дефолт.

Технология

9-patch позволяет вам указать область содержимого , которая, по сути, является отступом. Это заполнение используется, если вы не установили заполнение представления явно. Например, когда вы программно устанавливаете фон из 9 патчей для вида, для которого установлены отступы, они переопределяются. И наоборот, если вы устанавливаете отступы, они переопределяют то, что было установлено фоном из 9 патчей.

К сожалению, в макете XML невозможно определить порядок этих операций. Я думаю, что просто удаление фона из ваших TextViews поможет:

android:background="@null"
2 голосов
/ 10 июня 2015
public class TopAlignedTextView extends TextView {

    public TopAlignedTextView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public TopAlignedTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs);
        setIncludeFontPadding(false); //remove the font padding
        setGravity(getGravity() | Gravity.TOP);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        TextPaint textPaint = getPaint();
        textPaint.setColor(getCurrentTextColor());
        textPaint.drawableState = getDrawableState();
        canvas.save();

        //remove extra font padding
        int yOffset = getHeight() - getBaseline();
        canvas.translate(0, - yOffset / 2);

        if (getLayout() != null) {
            getLayout().draw(canvas);
        }
        canvas.restore();
    }
}
1 голос
/ 06 июля 2011

Вы определили поле макета?Например:

android:layout_marginTop="5dp"

В противном случае, если ваше текстовое представление обернуто внутри LinearLayout или другого контейнера, то этот холодный объект также имеет отступы или поля.

0 голосов
/ 07 июня 2019

андроид: includeFontPadding = "ложь"

0 голосов
/ 08 июня 2017

Мой способ исправить это довольно хакерский, но мне удалось заставить текст сидеть там, где я хотел, установив высоту текстового представления как статическую и возиться с ней до тех пор, пока она едва помещалась в текст.В моем случае стиль шрифта, который я использовал, имел высоту 64sp, поэтому я установил высоту моего textview равным 50sp, и все заработало нормально.Я также должен был установить foreground_gravity на дно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...