【问题标题】:Android: TextView: Remove spacing and padding on top and bottomAndroid:TextView:删除顶部和底部的间距和填充
【发布时间】:2011-06-13 17:09:32
【问题描述】:

当我在文本中有一个TextView 和一个\n 时,在右侧我有两个singleLine TextViews,一个在另一个下方,中间没有空格。我为所有三个TextViews 设置了以下内容。

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

左侧TextView 的第一行与右上角TextView 完美对齐。

左边第二行TextView比右下第二行TextView高一点。

TextViews 的顶部和底部似乎有某种隐藏的填充。我怎样才能删除它?

【问题讨论】:

  • 尝试将此文本视图的重力设置为center_vertical
  • 嗨,George Bailey,这么久了你有解决办法吗?我现在也遇到这个问题。你能给我你的解决方案吗?谢谢。
  • @mmm2006, 这么久了,我不知道我最终做了什么。尝试答案中的解决方案。如果这不起作用,请提出一个新问题。
  • 这对我不起作用
  • 以下任何一个答案都不适合我,你能帮忙

标签: android textview padding spacing


【解决方案1】:
setIncludeFontPadding (boolean includepad)

或在XML 中,这将是:

android:includeFontPadding="false"

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

【讨论】:

  • 但它似乎总是有一个1dp 顶部/底部填充,我错了吗?(我使用Developer options -> Show layout bounds
  • includeFontPadding="false" 确实删除了一些空间,但不是全部。很奇怪。
  • 这可能是一把双刃剑。 includeFontPadding 非常适合从字体本身中删除任何额外的填充,但它可能会导致具有升序和降序的语言出现问题。如果您这样做,我会确保您测试西班牙语和泰语等语言(如果您支持它们)。
  • 设置运行时后,它没有采用顶部填充,但底部填充仍然存在,甚至左右填充也是如此?有什么建议吗?
  • 这对我不起作用。我不明白我错过了什么。我的 TextView 底部仍然有多余的空间
【解决方案2】:

我搜索了很多正确的答案,但没有在哪里可以找到可以完全从TextView 中删除所有填充的答案,但最后在通过official doc 之后,我找到了单行的解决方法文字

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

将这两行添加到TextView xml 即可。
第一个属性删除为重音保留的填充,第二个属性删除保留的间距以保持两行文本之间的适当间距。

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

【讨论】:

  • 添加这两行对我不起作用,填充也没有变化
  • @sunilkushwah,如果你做得好,它肯定会起作用。如果您能提供有关您的问题的更多详细信息,我们将很乐意提供帮助。
  • @sunilkushwah 你可以推到github上分享链接
  • @sunilkushwah 我看到您使用的是 Brandon 字体(自定义字体)。您可以尝试删除fontPath 属性吗?
  • 我试过了,但它不起作用,注意:我不想在 TextView 中使用任何默认填充
【解决方案3】:

我感觉到你的痛苦。我已经尝试了上面的每个答案,包括将setIncludeFontPadding 设置为 false,这对我没有任何帮助。

我的解决方案? layout_marginBottom="-3dp" 上的TextView 为您提供了底部的解决方案, 砰!

虽然,layout_marginTop 上的 -3dp 失败....呃。

【讨论】:

  • 这可能会导致文本底部被截断
  • 使用负边距真的很糟糕。最好考虑自定义视图并完全按照您的意愿绘制文本。
  • 如果是这样的补丁,你也应该计算字体大小的比例。
【解决方案4】:

你可以尝试使用这个属性(ConstraintLayout):layout_constraintBaseline_toBaselineOf

像这样:

app:layout_constraintBaseline_toBaselineOf="@+id/textView"

【讨论】:

  • Tnx。这也帮助我解决了另一个问题,即有一个具有多尺寸文本的文本视图。使用此解决方案,我可以使用具有不同文本大小的多个文本视图,并且在基线约束的帮助下,我可以像它的一个文本视图一样显示它们。
【解决方案5】:

更新的 XML

android:fontFamily="monospace"
android:includeFontPadding="false"

【讨论】:

  • 嗨,欢迎来到 Stack Overflow!当你回答一个问题时,你应该包括某种解释,比如作者做错了什么以及你做了什么来解决它。我告诉你这个是因为你的答案被标记为低质量,目前正在审查中。您可以点击“编辑”按钮edit您的答案。
  • 如果你已经有正确的字体,实际上改变 android:fontFamily 是没有必要的。基本上 android:includeFontPadding 是唯一必要的,它已在线程的先前答案中提到。
  • @DarekDeoniziak 有些字体有空格
【解决方案6】:

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

XML

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

科特林

text.firstBaselineToTopHeight = 0
text.includeFontPadding = false

【讨论】:

  • 一样,不工作。顶部还有额外的填充
【解决方案7】:

这也让我很恼火,我发现的答案是字体本身实际上有额外的空间,而不是 TextView。这是相当恼人的,来自文档发布背景,您对 Android 对排版元素的控制有限。我建议使用可能没有此问题的自定义字体(例如 Bitstream Vera Sans,它已获得再分发许可)。不过,我不确定它是否确实如此。

【讨论】:

  • 你有什么免费字体可以指点我吗?如果不分配负边距,我需要在顶部没有边距!谢谢!
【解决方案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;
    }
}

【讨论】:

  • 这是问题还是答案?
  • @Tushar 这是一个答案。
  • 虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因将真正有助于提高您的帖子质量(并获得投票)。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人!请编辑您的答案以添加解释,并说明适用的限制和假设。
  • TextView 继承,尤其是覆盖onDraw 在我看来是一个非常糟糕的主意。这样一来,您将失去 Google 在未来版本中所做或将要做的所有花哨的装饰(当然也没有来自 AppCompat 的功能),并且您无法匹配此控件的 OEM 特定样式设备(如果有)。
  • 它可能会起作用,但是在每个度量事件上创建新的 TextView 并不节省内存。 Android Lint 不鼓励在 draw()、onDraw() 或任何与布局相关的方法中创建新对象,并且在布局期间可能会被未知时间调用。
【解决方案9】:

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

【讨论】:

    【解决方案10】:
    <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 对齐的基线,并将 ImageView 上的 android:baselineAlignBottom 设置为 true,这将使 ImageView 的基线位于底部。其他视图可以使用 ImageView 的底部对齐自身,该底部与 TextView 的基线相同。

    然而,这只会修复填充底部而不是顶部。

    【讨论】:

    • 非常适合我的情况,比删除字体填充要好得多。 +1
    【解决方案11】:

    由于我的要求是覆盖从findViewById(getResources().getIdentifier("xxx", "id", "android")); 获取的现有textView,所以我不能简单地尝试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 个(即原版):

    【讨论】:

      【解决方案12】:

      我觉得这个问题可以这样解决:

       <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" 正是我所需要的!谢谢。
      【解决方案13】:

      简单的方法有效:

      setSingleLine();
      setIncludeFontPadding(false);
      

      如果不起作用,请尝试在该代码上方添加:

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

      如果您需要多行,也许您需要通过临时单行 TextView(删除填充之前和之后)精确计算填充顶部和底部的高度,然后使用负填充或某些 Ghost 布局应用降低高度结果翻译 Y. Lol

      【讨论】:

        【解决方案14】:

        唯一有效的是

        android:lineSpacingExtra="-8dp"
        

        【讨论】:

          【解决方案15】:

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

          【讨论】:

          • 但是顶行不会对齐。实际上,我并不在乎它们排成一行,因为我真的很想删除间距。
          【解决方案16】:

          据我所知,这是大多数小部件所固有的,并且“填充”的数量因手机制造商而异。这个填充实际上是图像边框和 9 补丁图像文件中的图像之间的空白。

          例如,在我的 Droid X 上,微调器小部件比按钮获得更多的空白空间,这使得当您将微调器与按钮内联时看起来很尴尬,但在我妻子的手机上,相同的应用程序没有相同的问题,并且看起来很棒!

          我唯一的建议是创建您自己的 9 个补丁文件并在您的应用程序中使用它们。

          啊,Android 的痛苦。

          已编辑:澄清填充与空白。

          【讨论】:

            【解决方案17】:

            这个技巧对我有用(对于 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>
            

            【讨论】:

            • 此技巧可能不适用于不同的字体、大小或布局。
            【解决方案18】:

            使用约束布局作为你的根视图,然后添加一个指南助手。

            例子:

            <TextView
             android:id="@+id/textView1"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content" 
             app:layout_constraintTop_toTopOf="parent" 
             app:layout_constraintStart_toStartOf="parent" />
            
            <TextView
             android:id="@+id/textView2"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content" 
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toBottomOf="@+id/guideline" />
            
            <androidx.constraintlayout.widget.Guideline
             android:id="@+id/guideline"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:orientation="horizontal"
             app:layout_constraintGuide_begin="20dp" />
            

            属性 layout_constraintGuide_begin 值只是示例,它取决于您的需要。

            【讨论】:

              【解决方案19】:

              看这个:

              Align ImageView with EditText horizontally

              EditText 的背景图片似乎有一些透明像素,也添加了填充。

              解决方案是将 EditText 的默认背景更改为其他内容(或不更改任何内容,但 EditText 没有背景可能是不可接受的)。可以设置 android:background XML 属性。

              android:background="@drawable/myEditBackground"
              

              【讨论】:

                【解决方案20】:

                在你的 ImageView xml 中使用它

                android:adjustViewBounds="true"

                【讨论】:

                • 请添加一些解释
                • 我认为必须理解这一点。我只能在xml中使用。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2018-04-01
                • 2020-12-05
                • 1970-01-01
                • 1970-01-01
                • 2019-12-29
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多