30

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

堆叠的文本视图

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

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

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

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


完整的布局代码:

<LinearLayout 
    android:id="@+id/boxTime"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="20dp" >

    <TextView
        android:id="@+id/textRemainingTime2"
        android:layout_width="wrap_content"
        android:layout_heigh="wrap_content"
        android:layout_gravity="center"
        android:gravity="center_horizontal"
        android:textSize="70sp"
        android:includeFontPadding="false"
        android:lineSpacingMultiplier="1"
        android:lineSpacingExtra="0dp"
        android:paddingTop="0dp"
        android:paddingBottom="0dp"
        android:layout_marginTop="0dp"
        android:layout_marginBottom="0dp"
        android:text="@string/title" />

    <TextView
        android:id="@+id/textRemainingTime"
        android:layout_width="wrap_content"
        android:layout_heigh="wrap_content"
        android:layout_gravity="center"
        android:gravity="center_horizontal"
        android:includeFontPadding="false"
        android:lineSpacingMultiplier="1"
        android:lineSpacingExtra="0dp"
        android:paddingTop="0dp"
        android:paddingBottom="0dp"
        android:layout_marginTop="0dp"
        android:layout_marginBottom="0dp"
        android:textSize="107sp"
        android:text="@string/timer" />

</LinearLayout>
4

9 回答 9

48

尝试使用负边距。可能需要花点时间才能弄好数字,但我以前做过,而且效果很好。

android:layout_marginTop="-5dp"
于 2012-05-26T21:22:14.583 回答
27

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

 android:includeFontPadding="false"

或者

 textView.setIncludeFontPadding(false)
于 2014-10-13T18:34:39.270 回答
18

使文本的基线等于 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的父级ViewGroupandroid:clipChildren="false"在 XML 中)。

于 2012-11-29T13:53:34.073 回答
3

如果您将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

于 2016-05-20T11:48:49.487 回答
1

负边距可以解决问题

于 2012-05-26T21:24:20.777 回答
1

由于我的要求是覆盖现有的 textView get from 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 个(即原件):

在此处输入图像描述

于 2017-11-02T06:37:43.257 回答
1

只需在下面使用,无需其他任何东西。

 android:includeFontPadding="false"

如果您想要线间隙的一些变化,请使用:

android:lineSpacingExtra 
于 2021-02-16T06:56:26.570 回答
0

负边距会起作用。您可以通过两种方法设置它 -

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

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

于 2013-06-05T06:26:50.233 回答
0

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

高度介于 textsize 和带有 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

}

}

于 2015-04-25T03:47:39.207 回答