Android:TextView:删除顶部和底部的间距和填充

Bry*_*eld 181 android padding spacing textview

当我在文本中有a TextView\n,在右边我有两个singleLine TextViews,一个在另一个之下,两者之间没有间距.我为所有三个人设置了以下内容TextView.

android:lineSpacingMultiplier="1" 
android:lineSpacingExtra="0pt" 
android:paddingTop="0pt" 
android:paddingBottom="0pt"
Run Code Online (Sandbox Code Playgroud)

左边的第一行TextView与右上角完美排列TextView.

左边TextView的第二行略高于右下角的第二行TextView.

似乎在TextViews 的顶部和底部有某种隐藏的填充.我怎么能删除它?

use*_*545 469

setIncludeFontPadding (boolean includepad)
Run Code Online (Sandbox Code Playgroud)

或者在XML这将是:

android:includeFontPadding="false"
Run Code Online (Sandbox Code Playgroud)

设置是否TextView包括额外的顶部和底部填充,以便为超出正常上升和下降的重音腾出空间.默认值为true.

  • `includeFontPadding ="false"`确实删除了一些空间,但不是全部空间.很奇怪. (84认同)
  • 这可能是一把双刃剑.`includeFontPadding`非常适合从字体本身中删除任何其他填充,但它可能会导致具有上升和下降的语言出现问题.我会确保你是否这样做,你测试西班牙语和泰语等语言,如果你支持它们. (6认同)
  • 这不适合我.我不明白我错过了什么.我的TextView底部仍然有不需要的空间 (5认同)
  • 但似乎总是有一个`1dp`顶部/底部填充,我错了吗?(我使用`开发人员选项 - >显示布局界限`) (3认同)
  • 在设置运行时之后,它没有采用顶部填充,但底部填充仍然存在,甚至左右填充也是如此?有什么建议吗? (3认同)
  • 请注意,因为这将删除显示字母的一些底部部分所需的填充,如"p","y",g.这些信件将被部分切断. (2认同)

hun*_*erp 39

我感觉到你的痛苦.我已经尝试过上面的每一个答案,包括setIncludeFontPadding假的,这对我没有任何帮助.

我的解决方案 layout_marginBottom="-3dp"在这TextView给你一个底部的解决方案,BAM!

虽然,-3dp layout_marginTop失败了......呃.

  • 这可能导致文本的底部可能被切断 (5认同)
  • 使用负边际真的不好主意.最好考虑自定义视图并根据需要绘制文本. (2认同)

Moh*_*tif 34

我搜索了很多正确的答案,但没有找到一个可以完全删除所有填充的答案TextView,但最后经过官方文档得到了单行文本的解决方法

android:includeFontPadding="false"
android:lineSpacingExtra="0dp"
Run Code Online (Sandbox Code Playgroud)

将这两行添加到TextViewxml将完成工作.
第一个属性删除为重音项保留的填充,第二个属性删除保留的空格以保持两行文本之间的适当空格.

确保不要添加lineSpacingExtra="0dp"多行TextView,因为它可能会使外观变得笨拙

  • 添加这两行对我来说不起作用,并且填充也没有变化 (8认同)

小智 17

更新的 XML

android:fontFamily="monospace"
android:includeFontPadding="false"
Run Code Online (Sandbox Code Playgroud)

  • 如果您已经有正确的字体,实际上不需要更改 android:fontFamily 。基本上 android:includeFontPadding 是唯一必要的,并且在线程之前的答案中已经提到过。 (2认同)

Sah*_*sal 12

添加 android:includeFontPadding="false" 看看它是否有帮助。并使文本视图大小与文本大小相同,而不是“包装内容”。它肯定会起作用。


kco*_*ock 10

这也让我恼火,我找到的答案是字体本身实际上有额外的空间,而不是TextView.从文档发布背景来看,这是相当令人恼火的,你对Android的印刷元素控制有限.我建议使用可能没有此问题的自定义字体(例如Bitstream Vera Sans,其被许可用于再分发).不过,我不确定具体是否确实如此.


Lin*_*nsh 8

我删除了自定义视图中的间距-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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 尽管此代码可以解决问题,但[如何解释](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实以及如何解决问题将真正有助于提高帖子的质量(并获得投票)。请记住,您将来会为读者回答问题,而不仅仅是现在问的人!请编辑您的答案以添加解释,并指出适用的限制和假设。 (2认同)

林果皞*_*林果皞 6

由于我的要求是覆盖从 获取的现有 textView findViewById(getResources().getIdentifier("xxx", "id", "android"));,所以我不能简单地尝试onDraw()其他答案。

但我只是找出解决问题的正确步骤,这是布局检查器的最终结果:

在此输入图像描述

由于我想要的只是删除顶部空格,所以我不必选择其他字体来删除底部空格。

这是修复它的关键代码:

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

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

myTextView.setIncludeFontPadding(false);
Run Code Online (Sandbox Code Playgroud)

第一个键是设置自定义字体“fonts/myCustomFont.otf”,它的底部有空格但顶部没有,您可以通过打开 otf 文件并单击 android Studio 中的任何字体轻松找出这一点:

在此输入图像描述

正如您所看到的,底部的光标有额外的间距,但顶部没有,所以它解决了我的问题。

The second key is you can't simply skip any of the code, otherwise it might not works. That's the reason you can found some people comment that an answer is working and some other people comment that it's not working.

Let's illustrated what will happen if I remove one of them.

Without setTypeface(mfont);:

在此输入图像描述

Without setPadding(0, 0, 0, 0);:

在此输入图像描述

Without setIncludeFontPadding(false);:

在此输入图像描述

Without 3 of them (i.e. the original):

在此输入图像描述


小智 6

您可以尝试使用此属性(ConstraintLayout):layout_constraintBaseline_toBaselineOf

像这样:

app:layout_constraintBaseline_toBaselineOf =“ @ + id / textView”

在此处输入图片说明

在此处输入图片说明


Viv*_*ven 5

<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>
Run Code Online (Sandbox Code Playgroud)

通过额外的 ImageView,我们可以将 TextView 设置为与 ImageView 的基线对齐,并将android:baselineAlignBottomImageView 上的 设为 true,这将使 ImageView 的基线位于底部。其他视图可以使用 ImageView 的底部自行对齐,该底部本身与 TextView 的基线相同。

然而,这仅修复了填充底部而不是顶部。


Mar*_*nci 5

如果使用AppCompatTextView(或从API 28向前),则可以使用这两个属性的组合来删除第一行的间距:

XML格式

android:firstBaselineToTopHeight="0dp"
android:includeFontPadding="false"
Run Code Online (Sandbox Code Playgroud)

科特林

text.firstBaselineToTopHeight = 0
text.includeFontPadding = false
Run Code Online (Sandbox Code Playgroud)


Jem*_*ems 0

您可能想尝试将左侧文本视图的底部与第二个右侧文本视图的底部对齐。