Android: TextView: удаление интервала и отступов сверху и снизу

Когда у меня есть TextView с \n в тексте, на право у меня есть два singleLine TextView с, один под другим, без интервала между ними. Я установил следующее для всех трех TextView.

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

Первая строка левого TextView идеально TextView с верхней правой TextView.

Вторая строка левого TextView немного выше, чем вторая строка нижнего правого TextView.

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

Ответ 1

setIncludeFontPadding (boolean includepad)

или в XML это будет:

android:includeFontPadding="false"

Задайте, включает ли TextView дополнительное верхнее и нижнее отступы, чтобы освободить место для акцентов, которые превышают нормальное восхождение и спуск. Значение по умолчанию - true.

Ответ 2

Я чувствую твою боль. Я пробовал каждый ответ выше, включая setIncludeFontPadding в false, который ничего не сделал для меня.

Мое решение? layout_marginBottom="-3dp" на TextView дает вам решение для нижней части, BAM!

Хотя, -3dp на layout_marginTop терпит неудачу.... тьфу.

Ответ 3

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

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

Добавление этих двух строк в TextView xml сделает всю работу.
Первый атрибут удаляет отступы, зарезервированные для акцентов, а второй атрибут удаляет интервал, зарезервированный для поддержания надлежащего пространства между двумя строками текста.

Не добавляйте lineSpacingExtra="0dp" в многострочное TextView, так как это может сделать внешний вид неуклюжим

Ответ 4

Это тоже меня раздражало, и ответ, который я нашел, заключался в том, что в самом шрифте есть дополнительное пространство, а не TextView. Это довольно раздражает, исходя из фона публикации документов, ограниченного количества контроля над Android над типографскими элементами. Я бы рекомендовал использовать пользовательский шрифт (например, Bitstream Vera Sans, который лицензирован для перераспределения), который может не иметь этой проблемы. Однако я не уверен, действительно ли это делает.

Ответ 5

Я удаляю интервал в моем пользовательском представлении - 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;
    }
}

Ответ 6

<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>

С помощью дополнительного ImageView мы можем установить TextView в исходное положение, выровненное с ImageView, и установить android:baselineAlignBottom в ImageView равным true, что сделает базовую линию ImageView снизу. Другие представления могут выравниваться, используя нижнюю часть ImageView, которая сама по себе совпадает с базовой линией TextView.

Это, однако, фиксирует только дно прокладки, а не верх.

Ответ 7

Я думаю, что эта проблема может быть решена следующим образом:

 <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" />

Вот результаты:

ScreenShot-1

ScreenShot-3

Хотя строка специальных символов в rightLowerText выглядит немного выше второй строки leftText, их базовые линии выравниваются.

Ответ 8

Поскольку мое требование переопределяет существующий textView get from findViewById(getResources().getIdentifier("xxx", "id", "android"));, поэтому я не могу просто попробовать onDraw() другого ответа.

Но я просто выясню правильные шаги для исправления моей проблемы, вот окончательный результат от Layout Inspector:

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

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

Вот критический код для его исправления:

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

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

myTextView.setIncludeFontPadding(false);

Первый ключ - это настраиваемый шрифт "fonts/myCustomFont.otf", который имеет место внизу, но не сверху, вы можете легко понять это с помощью открытого файла otf и щелкнуть любой шрифт в android Studio:

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

Как вы можете видеть, курсор внизу имеет дополнительный интервал, но не сверху, поэтому он исправил мою проблему.

Второй ключ , вы не можете просто пропустить любой код, иначе он может не работать. Это причина, по которой вы можете обнаружить, что некоторые люди отмечают, что ответ работает, а некоторые другие люди отмечают, что он не работает.

Покажем, что произойдет, если я удалю один из них.

Без setTypeface(mfont);:

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

Без setPadding(0, 0, 0, 0);:

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

Без setIncludeFontPadding(false);:

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

Без 3 из них (т.е. оригинала):

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

Ответ 9

Вы можете попробовать использовать этот атрибут (ConstraintLayout): layout_constraintBaseline_toBaselineOf

Как это:

Приложение: layout_constraintBaseline_toBaselineOf = "@+id/TextView"

enter image description here

enter image description here

Ответ 10

Если вы используете AppCompatTextView (или начиная с API 28 и далее), вы можете использовать комбинацию этих двух атрибутов для удаления пробела в первой строке:

XML

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

Котлин

text.firstBaselineToTopHeight = 0
text.includeFontPadding = false

Ответ 11

Простой метод работал:

setSingleLine();
setIncludeFontPadding(false);

Если это не сработало, попробуйте добавить этот код выше:

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

Если вам нужна многострочная информация, возможно, вам нужно будет точно рассчитать высоту верхнего и нижнего отступов с помощью временной строки TextView (до и после удаления отступов), а затем применить результат уменьшения высоты с отрицательным заполнением или какой-либо Ghost Layout с переводом Y. Лол

Ответ 12

Единственное, что сработало

android:lineSpacingExtra="-8dp"

Ответ 13

Возможно, вы захотите выполнить выравнивание нижней части левого текстового представления в нижней части второго правого текстового представления.

Ответ 14

Насколько мне известно, это присуще большинству виджетов, а количество "отступов" отличается от производителей телефонов. Это заполнение - это действительно пустое пространство между границей изображения и изображением в 9 файлах патча.

Например, на моем Droid X виджеты spinner получают лишнее пробел, чем кнопки, что делает его неудобным, когда у вас есть прядильный ролик с кнопкой, но на моей женской телефоне одно и то же приложение не имеет такой же проблемы и отлично смотрится!

Единственное, что я хотел бы сделать, это создать ваши собственные файлы исправлений и использовать их в вашем приложении.

Ahhh боли, которые являются Android.

Отредактировано: Уточнить дополнение к пробелу.

Ответ 15

Смотрите это:

Выровнять ImageView с EditText по горизонтали

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

Решением является изменение фона по умолчанию EditText на что-то другое (или ничего, но фон для EditText, вероятно, неприемлем). Это можно сделать установкой андроида: фоновым атрибутом XML.

android:background="@drawable/myEditBackground"

Ответ 16

Просто использовать

android:padding="0dp"

Ответ 17

Используйте это в вашем ImageView XML

андроид: adjustViewBounds = "истина"