我有一个垂直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:我找到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>
答案 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)
的父TextView
(ViewGroup
(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()
。
但我只是找出解决问题的正确步骤,这是布局检查器的最终结果:
因为我想要的只是删除顶部空格,所以我不必选择其他字体来删除底部空格。
以下是修复它的关键代码:
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个(即原文):
{{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