当我有一个TextView与一个\n在文本中,,在右边我有两个单线TextViews,一个在另一个之间没有间距。我已经为所有三个textview设置了以下内容。

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

第一行的左侧TextView线完美地与右上角TextView。

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

似乎有某种隐藏的填充顶部和底部的TextViews。我怎么才能去掉它呢?


当前回答

setIncludeFontPadding (boolean includepad)

或者在XML中是:

android:includeFontPadding="false"

设置TextView是否包括额外的顶部和底部填充,为正常上升和下降之上的重音腾出空间。默认为true。

其他回答

我搜索了很多正确的答案,但没有在哪里我可以找到一个答案,完全可以从TextView删除所有的填充物,但最后通过官方文档得到了一个工作围绕单行文本

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

将这两行添加到TextView xml中就可以了。 第一个属性删除为重音保留的填充,第二个属性删除为保持两行文本之间适当的空间而保留的间距。

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

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

因为我的要求是覆盖现有的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);:

没有整理(0,0,0,0);

没有setIncludeFontPadding(虚假);:

没有其中3个(即原件):

我删除间距在我的自定义视图- NoPaddingTextView。

https://github.com/SenhLinsh/NoPaddingTextView

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

使用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值只是一个例子,它取决于你的需要。