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

208

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

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

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

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

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

Брайан Филд
источник
попробуйте установить гравитацию этого текстового представления в center_vertical
Давид Хай
Привет, Джордж Бэйли, у тебя есть решение после столь долгого времени? Я тоже столкнулся с этой проблемой. Можете ли вы дать мне свое решение? Спасибо.
mmm2006
1
@ mmm2006, так давно я не знаю, что я в итоге делал. Попробуйте решения в ответах. Если это не сработает, задайте новый вопрос.
Брайан Филд
Это не сработало для меня
Марти Миллер
любой из приведенных ниже ответов не работает для меня, вы можете помочь
Рича

Ответы:

521
setIncludeFontPadding (boolean includepad)

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

android:includeFontPadding="false"

Установите, TextViewвключает ли дополнительная верхняя и нижняя прокладка, чтобы освободить место для акцентов, которые идут выше нормального подъема и спуска. По умолчанию это правда.

user634545
источник
3
Но, кажется, всегда есть 1dpверхний / нижний отступ, я не прав? (Я использую Developer options -> Show layout bounds)
Автоботы
94
includeFontPadding="false"действительно удаляет часть пространства, но не все. очень странно.
Theblang
7
Это может быть обоюдоострый меч. includeFontPaddingотлично подходит для удаления любых дополнительных отступов из самого шрифта, но может вызывать проблемы в языках с восходящими и нисходящими линиями. Я хотел бы убедиться, что если вы сделаете это, вы будете тестировать языки, такие как испанский и тайский, если будете их поддерживать.
Эллиотт
3
После настройки времени выполнения, это не верхний отступ, а нижний отступ, даже левый и правый? любое предложение?
Код
5
Это не сработало для меня. Я не понимаю, чего мне не хватает. У меня все еще есть ненужное место в нижней части моего TextView
Марти Миллер
41

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

Мое решение? layout_marginBottom="-3dp"на TextViewдает вам решение для дна, БАМ!

Хотя, -3dp layout_marginTopне удается .... тьфу.

hunterp
источник
6
Это может привести к тому, что нижняя часть текста может быть обрезана
Джейсон Робинсон
2
Действительно плохая идея использования отрицательной маржи. Лучше рассмотреть пользовательский вид и нарисовать текст именно так, как вы хотите.
Flynn81
Если патч как этот, вы должны рассчитать соотношение размера шрифта тоже.
phnghue
37

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

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

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

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

Мохаммед Атиф
источник
11
добавление этих двух строк не работает для меня, а также нет изменений в заполнении
Sunil Kushwah
@sunilkushwah, это определенно будет работать, если вы делаете это правильно. Был бы рад помочь, если вы можете предоставить более подробную информацию о вашей проблеме.
Мохаммед Атиф
@sunilkushwah Вы, вероятно, можете нажать на него на GitHub и поделиться ссылкой
Мохаммед Атиф
@sunilkushwah Я вижу, что вы используете Brandon Font (Custom Font). Можете ли вы однажды попробовать удалить fontPathатрибут?
Мухаммед Атиф
я пробовал это, но это не работает, Примечание: я не хочу никаких
отступов по
14

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

XML

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

Котлин

text.firstBaselineToTopHeight = 0
text.includeFontPadding = false
Марио Ленчи
источник
11

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

Кевин Коппок
источник
у вас есть бесплатный шрифт, чтобы указать мне? У меня не должно быть маржи сверху без назначения отрицательных полей! Спасибо!
хранилище
11

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

Как это:

Приложение: layout_constraintBaseline_toBaselineOf = "@ + идентификатор / TextView"

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

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

windplume
источник
10

Я удаляю интервал в моем собственном представлении - NoPaddingTextView.

https://github.com/SenhLinsh/NoPaddingTextView

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

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;
    }
}
Linsh
источник
Это вопрос или ответ?
Tushar
@ Тушар Это ответ.
Линьш
Хорошо. Можете ли вы добавить некоторые объяснения с кодом здесь.
Tushar
@ Тушар Конечно, но это немного больше.
Линш
3
Хотя этот код может решить вопрос, в том числе объяснение того, как и почему это решает проблему, действительно поможет улучшить качество вашего поста (и набрать голоса). Помните, что вы отвечаете на вопрос для читателей в будущем, а не только для того, кто спрашивает сейчас! Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение и указать, какие ограничения и предположения применяются.
Макьен,
3
<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.

Это, однако, только исправляет нижнюю часть отступа, а не верхнюю.

Viven
источник
идеально подходит для моей ситуации, намного лучше, чем удаление шрифтов. +1
Бава
3

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

 <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, их базовые линии выровнены.

Вэй Вэй
источник
includeFontPadding = "false" было именно то, что мне нужно! Спасибо.
человек
3

Так как мое требование переопределить существующий textView получить 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 из них (то есть оригинал):

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

Фрукты
источник
3

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

android:lineSpacingExtra="-8dp"
Антонис Радз
источник
3

Обновленный XML

android:fontFamily="monospace"
android:includeFontPadding="false"
SJJ
источник
Привет, добро пожаловать в Stack Overflow! Когда вы отвечаете на вопрос, вы должны включить какое-то объяснение, например, что автор сделал неправильно и что вы сделали, чтобы это исправить. Я говорю вам об этом, потому что ваш ответ был помечен как некачественный и в настоящее время рассматривается. Вы можете редактировать свой ответ, нажав кнопку «Редактировать».
Федерико Гранди
На самом деле изменение Android: fontFamily не требуется, если у вас уже есть правильный шрифт. В основном, android: includeFontPadding - единственная необходимая вещь, о которой упоминалось в предыдущих ответах из этой ветки.
Дарек Деонизиак
@DarekDeoniziak У некоторых шрифтов есть пробелы
SJJ
2

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

setSingleLine();
setIncludeFontPadding(false);

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

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

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

phnghue
источник
0

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

Jems
источник
Но тогда верхняя линия не выстроится в линию. И на самом деле я не забочусь о том, чтобы они выстраивались в линию так сильно, как бы мне хотелось убрать расстояние.
Брайан Филд
0

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

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

Единственное, что я могу предложить, - это создать свои 9 файлов патчей и использовать их в своем приложении.

Аааа боли, которые Android.

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

user432209
источник
0

Этот трюк сработал для меня (для min-sdk> = 18 ).

Я использовал android:includeFontPadding="false"и отрицательное поле, как android:layout_marginTop="-11dp"и положил TextViewвнутри FrameLayout( или любой ViewGroup ... )

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

и, наконец, примеры кодов:

<LinearLayout
    android:layout_width="60dp"
    android:layout_height="wrap_content"
    >

    <TextView
        style="@style/MyTextViews.Bold"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/yellow"
        android:textSize="48sp"
        android:layout_marginTop="-11dp"
        android:includeFontPadding="false"
        tools:text="1"/>
</LinearLayout>
Richi
источник
1
Этот трюк может не работать для разных шрифтов, размеров или макетов.
Адил Соомро
-1

Посмотри это:

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

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

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

android:background="@drawable/myEditBackground"
Ixx
источник
-2

Просто используйте

android:padding="0dp"
Хуан Бернал
источник
-5

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

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

Аншул Рават
источник
Пожалуйста, добавьте некоторые объяснения по этому поводу
Нико Хааз
Я думал, что это должно быть понято. Я могу быть использован только в XML.
Аншул Рават