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

时间:2011-01-22 15:38:18

标签: android textview padding spacing

当我在文本中有TextView \n时,我右边有两个singleLine TextView,一个在另一个之下,没有间距之间。我为所有三个TextView设置了以下内容。

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

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

TextView的第二行略高于右下角TextView的第二行。

似乎TextView的顶部和底部都有某种隐藏的填充。我该如何删除?

21 个答案:

答案 0 :(得分:438)

setIncludeFontPadding (boolean includepad)

XML这将是:

android:includeFontPadding="false"

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

答案 1 :(得分:36)

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

我的解决方案? layout_marginBottom="-3dp"上的TextView为您提供了底部的解决方案, BAM!

虽然layout_marginTop上的-3dp失败了......呃。

答案 2 :(得分:28)

我搜索了很多正确的答案,但没有找到一个可以完全删除TextView的所有填充的答案,但最后经过official doc后找到了解决方法< strong>单行文本

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

将这两行添加到TextView xml将完成工作 第一个属性删除为重音保留的填充,第二个属性删除保留的空格以保持两行文本之间的适当空格。

  

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

答案 3 :(得分:11)

更新的XML

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

答案 4 :(得分:8)

这也使我恼火,我发现答案是字体本身实际上有额外的空间,而不是TextView。从文档发布背景来看,这是相当令人恼火的,你对Android的印刷元素控制有限。我建议使用可能没有此问题的自定义字体(例如Bitstream Vera Sans,其被许可用于再分发)。不过,我不确定具体是否确实如此。

答案 5 :(得分:4)

添加android:includeFontPadding =“ false”来查看是否有帮助。并使文本视图的大小与文本大小相同,而不是“包装内容”。肯定可以。

答案 6 :(得分:4)

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

答案 7 :(得分:3)

<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的基线相同。

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

答案 8 :(得分:3)

我认为这个问题可以用这种方式解决:

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

结果如下:

ScreenShot-1

ScreenShot-3

虽然rightLowerText中的特殊字符行看起来比leftText的第二行略高,但它们的基线是静止对齐的。

答案 9 :(得分:2)

由于我的要求是覆盖现有的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

答案 10 :(得分:2)

简单的方法有效:

setSingleLine();
setIncludeFontPadding(false);

如果不起作用,请尝试在该代码上方添加该代码:

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

如果您需要多行,也许您需要通过临时单行TextView(在删除填充之前和之后)精确地计算出填充顶部和底部的高度,然后对负填充或某些Ghost Layout应用降低高度的结果翻译Y. Lol

答案 11 :(得分:1)

如果您使用AppCompatTextView(或从API 27开始),则可以使用这两个属性的组合来删除第一行的间距:

XML

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

科特林

text.firstBaselineToTopHeight = 0
text.includeFontPadding = false

答案 12 :(得分:1)

您可以尝试使用此属性(ConstraintLayout): //Data Insertion $res_ins = "INSERT INTO Survey (name, zip, gender, income, savings, disaster, work, res_road, work_road, evacuation, lodging, injury, children, num_child, educ, city_prep, PrepComments, emer_res, info, prep, fut_prep) VALUES ('$name', '$zip', '$gender', '$income', '$savings', '$disaster', '$work', '$res_road', '$work_road', '$evacuation', '$lodging', '$injury', '$children', '$num_child', '$educ', '$city_prep', '$PrepComments', '$emer_res', '$info', '$prep', '$fut_prep')"; $insert = $dbcon->query($res_ins); //Terminate connection to database and end insertion mysqli_close($dbcon);

赞:

  

app:layout_constraintBaseline_toBaselineOf =“ @ + id / textView”

enter image description here

enter image description here

答案 13 :(得分:1)

唯一有效的是

android:lineSpacingExtra="-8dp"

答案 14 :(得分:0)

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

答案 15 :(得分:0)

此技巧对我有用( 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>

答案 16 :(得分:0)

使用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 值只是示例,这取决于您的需求。

答案 17 :(得分:0)

只需使用

android:padding="0dp"

答案 18 :(得分:0)

据我所知,这是大多数小工具所固有的,而且“填充”的数量因手机制造商而异。此填充实际上是图像边框与9补丁图像文件中图像之间的空白区域。

例如在我的Droid X上,微调器小部件比按钮获得额外的空白区域,这使得当你有一个带有按钮的旋转器时,它看起来很尴尬,但是在我妻子的手机上,相同的应用程序没有相同的问题,看起来很棒!

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

啊,这是Android的痛苦。

编辑:澄清填充与空格。

答案 19 :(得分:-1)

见:

Align ImageView with EditText horizontally

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

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

android:background="@drawable/myEditBackground"

答案 20 :(得分:-3)

在ImageView xml中使用它

android:adjustViewBounds =“ true”