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

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

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

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

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

Solutions Collecting From Web of "Как удалить верхнее и нижнее пространство на текстовом экране Android"

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

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

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

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

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

Соответствующим образом скорректируйте значения.

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

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

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

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

 android:background="@null" 

Я столкнулся с той же проблемой. Вот хороший ответ: как выровнять текст в верхней части 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 (); } } 
 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(); } } 

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

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

 android:layout_marginTop="5dp" 

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

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

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

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

Ответ кода 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" /> 

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

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

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

 android:paddingTop="0dp" android:paddingBottom="0dp"