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

当我在文本中有\nTextView ,右侧有两个singleLine ,一个在另一个下面,两者之间没有间距。 我为所有三个TextView设置了以下内容。

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

左边的TextView的第一行与右上方的TextView完全TextView 。 左侧TextView的第二行比右下angularTextView的第二行稍高。

似乎在TextView的顶部和底部有一些隐藏的填充。 我怎样才能删除?

 setIncludeFontPadding (boolean includepad) 

或以XML这将是:

 android:includeFontPadding="false" 

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

我感受到你的痛苦。 我已经尝试了上面的所有答案,包括setIncludeFontPadding为false,这对我没有任何帮助。

我的解决scheme TextView上的layout_marginBottom="-3dp"为您提供底部BAM的解决scheme!

虽然,layout_marginTop上的layout_marginTop失败….呃。

我search了很多正确的答案,但没有find一个答案,可以从TextView完全删除所有的填充,但最后经过官方的文档得到了单线文本的工作

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

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

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

这也让我很恼火,我发现的答案是,字体本身实际上还有额外的空间,而不是TextView。 从文档发布的背景来看,这是相当让人恼火的一点,那就是Android对印刷元素的控制有限。 我build议使用自定义字体(比如Bitstream Vera Sans,这是允许重新分发的),可能没有这个问题。 不过,我不确定具体是否这样做。

 <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基线alignment,并将ImageView上的android:baselineAlignBottom设置为true,这将使ImageView的基线底部。 其他视图可以使用ImageView的底部自行alignment,它本身与TextView的基线相同。

但是,这只能修复填充底部而不是顶部。

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

  <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" /> 

这些是结果:

截屏1

截屏3

虽然rightLowerText中的特殊字符行看起来比leftText的第二行稍高一点,但是它们的基线是平稳alignment的。

我删除我的自定义视图中的空格 – 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; } } 

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

据我所知,这是大多数小部件固有的,“填充”的数量在电话制造商中是不同的。 该填充实际上是图像边界与9补丁映像文件中的图像之间的空白区域。

例如,在我的Droid X上,微调控件获得了比button更多的空白空间,这使得当你有一个微调内联button时,看起来很尴尬,但在我妻子的手机上,同样的应用程序没有同样的问题,看起来不错!

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

呃,这是Android的痛苦。

编辑:澄清填充VS空白。

看到这个:

将ImageView与EditText水平alignment

看来,EditText的背景图像有一些透明的像素,也添加填充。

一个解决scheme是将EditText的默认背景改为其他东西(或者什么也没有,但是没有EditText的背景可能是不可接受的)。 这可以设置android:background XML属性。

 android:background="@drawable/myEditBackground" 

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

但是我只是想出解决我的问题的正确步骤,这里是Layout Inspector的最终结果:

在这里输入图像描述

因为我想要的只是删除顶部空间,所以我不必select其他字体来删除底部空间。

这是修复它的关键代码:

 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中点击任何字体:

在这里输入图像描述

正如你所看到的,底部的光标有额外的空间,但不在顶部,所以它解决了我的问题。

第二个关键是你不能简单地跳过任何代码 ,否则可能无法工作。 这就是你可以find一些人评论说,一个答案正在工作,而另外一些人则认为它不起作用的原因。

让我们来说明如果我删除其中一个会发生什么。

没有setTypeface(mfont);

在这里输入图像描述

没有setPadding(0, 0, 0, 0);

在这里输入图像描述

没有setIncludeFontPadding(false);

在这里输入图像描述

没有3个(即原来的):

在这里输入图像描述