删除堆叠的TextView之间的空间

我有一个垂直的LinearLayoutLinearLayout有两个TextView 。 前者包含一个静态文本属性(它的文本永远不会改变),而最后一个包含一个回归计时器。 下图显示了两个项目:

堆叠的textviews

我想消除两个文本都有顶部和底部的空白区域。 我尝试了几种方法……

 android:includeFontPadding="false" android:lineSpacingMultiplier="1" android:lineSpacingExtra="0dp" android:paddingTop="0dp" android:paddingBottom="0dp" android:layout_marginTop="0dp" android:layout_marginBottom="0dp" 

……但他们都没有删除文本上方的空格。 如何在没有任何额外空间的情况下使两个文本彼此靠近?

PS:我发现了类似的问题 ,但没有人回答。


完整的布局代码:

     

尝试使用负边距。 可能需要花一点时间才能正确使用这些数字,但我之前已经完成了它并且效果很好。

 android:layout_marginTop="-5dp" 

使文本的基线等于TextView的底部。

 public class BaselineTextView extends TextView { public BaselineTextView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onDraw(Canvas canvas) { int yOffset = getHeight() - getBaseline(); canvas.translate(0, yOffset); super.onDraw(canvas); } } 

注意:为避免切断setClipChildren(false) ,请在TextView的父ViewGroup上调用setClipChildren(false) (在XML中为android:clipChildren="false" )。

默认情况下, TextView包含一些填充以为重音字符留出空间 。 你可以用以下方式关闭它:

  android:includeFontPadding="false" 

要么

  textView.setIncludeFontPadding(false) 

负利润将成功

如果将includeFontPadding设置为false,则会有所帮助。

 android:includeFontPadding="false" 

但是如果你知道你没有任何下降器,因为你设置了

 android:textAllCaps="true" 

或者您知道没有具有下行的字符,您可以创建自定义TextView并将高度设置为基线。

 public class ExTextView extends TextView { public ExTextView(Context context) { this(context, null); } public ExTextView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public ExTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public ExTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override protected void onDraw(Canvas canvas) { setHeight(getBaseline()); // < --- Shrink size to baseline super.onDraw(canvas); } } 

源代码包含在我的UiComponents测试应用程序中。 https://github.com/landenlabs/UiComponents

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

在此处输入图像描述

负边距可以完成工作。 你可以用两种方法设置它 –

1)通过xml – 设置android:Layout_marginTop="-10dp"字段为负数

2)通过java(以编程方式) – 将LayoutParams的topMargin字段设置为负数。

你应该改变TextView的高度,也许改变android:gravity =“bottom”

高度介于textize和带有Wrapcontent的textView的大小之间。

 public class MyTextViewBounder extends TextView { public MyTextViewBounder(Context context) { super(context); } public MyTextViewBounder(Context context, AttributeSet attrs) { super(context, attrs); } public MyTextViewBounder(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //test kích thước thực tế với kích thước của Textview bao quanh text của nó như thế nào int width, height; Paint iPaint; Rect iRect = new Rect(); iPaint = new Paint(); iPaint.setTextSize(13); iPaint.setTextAlign(Paint.Align.CENTER); //call below code outsite //this.setText("Hung"); //this.setTextSize(TypedValue.COMPLEX_UNIT_PX,13); //this..setIncludeFontPadding(false); //height from 18px down to 15px iPaint.getTextBounds("Hung",0,4,iRect); //width = 34px, height = 12px width = this.getWidth(); //= 30px height = this.getHeight(); //= 18px width = this.getMeasuredWidth(); //=30px height = this.getMeasuredHeight(); //= 18px width = iRect.width(); //34px height = iRect.height(); //12 px } 

}