Подтвердить что ты не робот

Как удалить верхнее и нижнее пространство на текстовом экране Android

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

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

enter image description here

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

что-то вроде этого:

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

отрегулируйте значения соответственно.

Ответ 3

У меня была та же проблема. Атрибут 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

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

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

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

к

int additionalPadding = getTextSize() - getLineHeight();

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

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

Ответ 5

Это код, который спас наш день. Он был адаптирован с использованием кода моно С# из 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);
    }
}

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

Ответ 6

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

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

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

android:background="@null"

Ответ 7

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

Ответ 8

Определили ли вы макет макета? Например:

android:layout_marginTop="5dp"

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

Ответ 9

android:background="@android:drawable/editbox_background"

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

Ответ 10

Внутри LinearLayout может возникнуть проблема с заполнением по умолчанию. Попробуйте установить его на 0dp. Это сработало для меня.

Ответ 11

ответ кода TopAlignedTextView: TopAlignedTextView @GitHub

используйте его по расположению:

<com.github.captain_miao.view.TopAlignedTextView
    android:id="@+id/text_a"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:text="@string/text_demo_a"
/>

введите описание изображения здесь

Ответ 12

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

Ответ 13

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