删除堆叠的TextView之间的空间

时间:2012-05-26 21:12:35

标签: android android-layout textview

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

stacked 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:我找到this similar question,但没有人回答。


完整布局代码:

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

9 个答案:

答案 0 :(得分:43)

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

android:layout_marginTop="-5dp"

答案 1 :(得分:16)

使文本的基线等于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)的父TextViewViewGroup(XML)中的android:clipChildren="false"

答案 2 :(得分:12)

默认情况下为TextView includes some padding to leave space for accent characters。你可以用以下方式关闭它:

 android:includeFontPadding="false"

 textView.setIncludeFontPadding(false)

答案 3 :(得分:2)

负边距将起作用

答案 4 :(得分:2)

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

答案 5 :(得分:1)

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

{{3}}

答案 6 :(得分:0)

负边距可以完成这项工作。您可以通过两种方法设置它 -

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

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

答案 7 :(得分:0)

你应该改变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

}

}

答案 8 :(得分:0)

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

 android:includeFontPadding="false"

如果您想改变行距,请使用:

android:lineSpacingExtra