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

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

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

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

TextView的第二行比右下TextView的第二行略高。

在__abc0的顶部和底部似乎有某种隐藏的填充。我怎么才能去掉它呢?

204945 次浏览

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

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

例如,在我的Droid X上,旋转窗口小部件比按钮有更多的空白,这让你在旋转窗口内嵌一个按钮时看起来很尴尬,但在我妻子的手机上,同样的应用程序没有同样的问题,看起来很棒!

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

啊,Android的痛苦。

编辑:澄清填充和空白。

这也惹恼了我,我发现的答案是,实际上有额外的空间在字体本身,而不是TextView。对于一个文档出版背景的人来说,Android对排版元素的有限控制是相当令人恼火的。我建议使用自定义字体(如Bitstream Vera Sans,它是授权重新分发的),可能不会有这个问题。不过,我不确定它是否确实如此。

setIncludeFontPadding (boolean includepad)

或在XML中,这将是:

android:includeFontPadding="false"

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

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

< p >我的解决方案吗?TextView上的layout_marginBottom="-3dp"给出了底部的解决方案, 砰!< / p >

虽然-3dp在layout_marginTop失败....ugh。

看到这个:

将ImageView与EditText水平对齐

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

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

android:background="@drawable/myEditBackground"
<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的底部来对齐自己,ImageView本身与TextView的基线相同。

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

我搜索了很多正确的答案,但没有在哪里我能找到一个答案,可以完全删除所有的填充从TextView,但最后经过官方文档得到了一个工作为单行文本

android:includeFontPadding="false"
android:lineSpacingExtra="0dp"
将这两行添加到TextView xml中就可以了 第一个属性删除为重音保留的填充,第二个属性删除为保持两行文本之间适当的空间而保留的间距

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

我删除间距在我的自定义视图- 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;
}
}

我认为这个问题可以这样解决:

 <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中的第二行高一些,但它们的基线仍然是对齐的。

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

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

enter image description here

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

以下是修复它的关键代码:

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

enter image description here

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

第二个键是您不能简单地跳过任何代码,否则它可能不起作用。这就是为什么你会发现一些人评论说某个答案有效,而另一些人则评论说它无效。

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

没有setTypeface(mfont);:

enter image description here

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

enter image description here

没有setIncludeFontPadding(false);:

enter image description here

没有其中3个(即原件):

enter image description here

简单的方法奏效:

setSingleLine();
setIncludeFontPadding(false);

如果它没有工作,然后尝试添加这个代码:

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

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

唯一有效的是

android:lineSpacingExtra="-8dp"

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

是这样的:

应用:layout_constraintBaseline_toBaselineOf =“@ + id / textView”

enter image description here

enter image description here

在imageviewxml中使用这个

android: adjustViewBounds = " true "

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

XML

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

芬兰湾的科特林

text.firstBaselineToTopHeight = 0
text.includeFontPadding = false

这个技巧对我有用(对于Min-sdk >= 18)。

我使用android:includeFontPadding="false"消极的保证金,如android:layout_marginTop="-11dp",并将我的TextView放在FrameLayout (或任何ViewGroup…)中

enter image description here

最后是示例代码:

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

更新XML

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

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

使用constraintlayout作为根视图,然后添加一个指导线助手。

例子:

<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值只是一个例子,它取决于你的需要。

你可以用这里列出的一些技巧来部分解决这个问题(负边距,字体填充等),但你不能绕过字体本身的大小[1]。每个“cell”的固定高度;的大小必须足以容纳最高的字符所有语言

如果你采用了其他答案中列出的技巧,字体可以被剪掉。

解决方案是向你的设计师解释字体是如何包装的,并让他们在设计中考虑到这一点。不要因为在翻译到其他语言时出现bug而现在就进行修改。

我想人们可以用压缩升序和降序来打包他们自己的字体。

这招对我很管用:

android:minHeight="0dp"

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