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 = "истина"