Android:TextView:上下の間隔とパディングを削除


208

テキストにaがTextView付いているaがある場合\n、右側には2つsingleLine TextViewのsがあり、1つはもう一方の下にあり、間にスペースはありません。3つすべてに以下を設定しましたTextView

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

左の最初の線はTextView右上と完全に並んでいますTextView

TextViewの2番目の線は、右下の2番目の線よりも少し高くなっていTextViewます。

TextViewsの上部と下部にある種の隠しパディングがあるようです。どうすれば削除できますか?


center_verticalにこのTextViewの一連の重力にしてみてください
DawidHyży

こんにちは、ジョージ・ベイリー、久しぶりに解決策はありますか?私もこの問題に遭遇しました。あなたに私にあなたの解決策をくれますか?ありがとう。
mmm2006 '30

1
@ mmm2006、長い間私は何をしていたのか分かりません。答えの中の解決策を試してください。それでもうまくいかない場合は、新しい質問をしてください。
ブライアンフィールド

これは私にとってはうまく
Marty Miller

答え以下のいずれかの私のために仕事をdidntのは、あなたが助けることができる
Richa

回答:


520
setIncludeFontPadding (boolean includepad)

またはXMLこれは次のようになります:

android:includeFontPadding="false"

TextViewに追加の上部および下部パディングを含めて、通常の上昇および下降を超えるアクセントの余地を作るかどうかを設定します。デフォルトはtrueです。


3
しかし、それは常に1dp上部/下部のパディングを持っているようです、私は間違っていますか?(私は使用していますDeveloper options -> Show layout bounds
Autobots

94
includeFontPadding="false"一部のスペースは削除されますが、すべてが削除されるわけではありません。非常に奇妙な。
theblang 2014

7
これは両刃の剣でもかまいません。includeFontPaddingフォント自体から追加のパディングを削除するのに最適ですが、アセンダーとディセンダーがある言語で問題が発生する可能性があります。私がこれを行うなら、スペイン語やタイ語などの言語をサポートしていればテストすることを確認します。
エリオット

3
ランタイムを設定した後、上部パディングはなく、下部パディングも残っています。左右のパディングも同じですか?なにか提案を?
CoDe 2015

5
これは私にはうまくいきませんでした。何が欠けているのか理解できません。TextViewの下部にまだ不要なスペースがある
Marty Miller

41

あなたの痛みが分かります。私setIncludeFontPaddingは何もしなかったfalse を含む上記のすべての答えを試しました。

私の解決策? layout_marginBottom="-3dp"上のTextViewBAM、BAMのためのソリューションを提供します!

ただし、-3 dpはlayout_marginTop失敗します。


6
これにより、テキストの下部が途切れる可能性があります
Jason Robinson、

2
負のマージンを使用するのは本当に悪い考えです。カスタムビューを検討し、希望どおりにテキストを正確に描画することをお勧めします。
Flynn81 2016年

このようなパッチの場合、フォントサイズの比率も計算する必要があります。
phnghue 2018

37

私は適切な答えをたくさん探しましたが、からすべてのパディングを正確に取り除くことができる答えを見つけることができませんでしたTextViewが、最終的に公式ドキュメントを通過した後、単一行テキストの回避策を得ました

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

これらの2行をTextViewxmlに追加すると、作業が完了します。
最初の属性はアクセント用に予約されたパディングを削除し、2番目の属性は2行のテキスト間の適切なスペースを維持するために予約されたスペースを削除します。

lineSpacingExtra="0dp"外観がぎこちなくなる可能性があるため、複数行のTextView を追加しないでください。


11
これらの2行を追加することは私のために働いても、パディングに変更はありませんされていません
スニルkushwah

@sunilkushwah、きちんとやれば間違いなく動作します。あなたがあなたの問題についてより多くの詳細を提供することができれば、喜んでお手伝いします。
Mohammed Atif 2017年

@sunilkushwahおそらくそれをgithubにプッシュしてリンクを共有できます
Mohammed Atif 2017年

@sunilkushwah Brandon Font(Custom Font)を使用しているようです。fontPath属性を削除してみてください。
Mohammed Atif 2017年

私はこれを試しましたが機能しません、注:TextViewのデフォルトのパディングは必要ありません
sunil kushwah

14

あなたが使用している場合AppCompatTextView(またはからAPI 28以降)は、最初の行にスペースを削除するために、これらの2つの属性の組み合わせを使用することができます。

XML

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

コトリン

text.firstBaselineToTopHeight = 0
text.includeFontPadding = false

11

これも私を困らせました、そして私が見つけた答えはフォント自体に実際にはテキストビューではなく追加のスペースがあるということでした。それは、文書発行の背景から来て、Androidを使用して活版印刷要素を制御できる制限された量から、いらいらします。この問題が発生しない可能性のあるカスタム書体(再配布が許可されているBitstream Vera Sansなど)を使用することをお勧めします。確かにそうなのかどうかははっきりしません。


私にポイントする無料のフォントはありますか?負のマージンを割り当てずに上部にマージンを設定する必要はありません!ありがとうございました!
ボールト

11

この属性(ConstraintLayout)を使用してみることができます:layout_constraintBaseline_toBaselineOf

このような:

app:layout_constraintBaseline_toBaselineOf = "@ + id / textView"

ここに画像の説明を入力してください

ここに画像の説明を入力してください


10

カスタムビューの間隔を削除します-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;
    }
}

この質問または回答ですか?
Tushar

@Tusharそれは答えです。
Linsh

OK。ここにコードの説明を追加してください。
Tushar

@Tushar確かに、それはもう少しです。
Linsh

3
このコードは問題を解決する可能性がありますが、これが問題を解決する方法と理由の説明含めて、投稿の品質を向上させる(そして投票を獲得する)のに役立ちます。あなたが今尋ねている人だけでなく、将来の読者のための質問に答えていることを忘れないでください!回答を編集して説明を追加し、適用される制限と前提を示してください。
Makyen

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とベースラインで整列するように設定し、 android:baselineAlignBottomし、ImageView onをtrueにできます。これにより、ImageViewのベースラインが下になります。他のビューは、それ自体がTextViewのベースラインと同じであるImageViewの下部を使用して、それ自体を位置合わせできます。

ただし、これは上部ではなくパディング下部のみを修正します。


私の状況に最適です。フォントのパディングを削除するよりもはるかに優れています。+1
Bawa

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の2行目より少し高く見えますが、ベースラインは揃えられています。


includeFontPadding = "false"はまさに私が必要とするものでした!ありがとう。
hman

3

私の要件は既存のtextView getをオーバーライドする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で任意のフォントをクリックすると、簡単にこれを理解できます。

ここに画像の説明を入力してください

ご覧のとおり、下部のカーソルには余白がありますが、上部にはありません。そのため、問題が解決しました。

2番目の重要な点は、単純にコードをスキップできないことです。そうしないと、機能しない可能性があります。そのため、回答が機能しているとコメントする人もいれば、機能していないとコメントする人もいます。

それらの1つを削除するとどうなるかを説明します。

なしsetTypeface(mfont);

ここに画像の説明を入力してください

なしsetPadding(0, 0, 0, 0);

ここに画像の説明を入力してください

なしsetIncludeFontPadding(false);

ここに画像の説明を入力してください

それらの3つなし(つまり、オリジナル):

ここに画像の説明を入力してください



3

更新されたXML

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

こんにちは、Stack Overflowへようこそ。質問に答えるときは、作者が間違ったことや修正のために何をしたかなど、何らかの説明を含める必要があります。これは、あなたの回答が低品質であると報告されており、現在レビュー中であるためです。「編集」ボタンをクリックすると、回答を編集できます。
フェデリコグランディ

正しいフォントがすでにある場合は、android:fontFamilyを実際に変更する必要はありません。基本的にandroid:includeFontPaddingが唯一必要なものであり、スレッドからの以前の回答で言及されています。
Darek Deoniziak

@DarekDeoniziak一部のフォントには、スペース持っている
SJJ

2

簡単な方法が機能しました:

setSingleLine();
setIncludeFontPadding(false);

うまくいかない場合は、そのコードの上にこれを追加してみてください:

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

複数行が必要な場合は、一時的な単一行TextView(削除の前後のパディング)を介して上部と下部のパディングの高さを正確に計算し、負のパディングを使用して高さの減少の結果を適用するか、Yを平行移動してゴーストレイアウトを適用する必要があります。笑


0

左側のテキストビューの下部を2番目の右側のテキストビューの下部に揃えてみてください。


しかし、その場合、一番上の行は整列しません。そして、実際には、間隔をなくしたいほど、それらが並ぶことを気にしません。
ブライアンフィールド

0

私の知る限り、これはほとんどのウィジェットに固有であり、「パディング」の量は電話メーカーによって異なります。このパディングは、イメージの境界線と9パッチイメージファイルのイメージの間の実際の空白です。

たとえば、私のDroid Xでは、スピナーウィジェットはボタンよりも余分な空白を取得します。これにより、ボタンとインラインのスピナーがあると見栄えが悪くなりますが、妻の携帯電話では同じアプリケーションに同じ問題がなく、見栄えがよくなります。

私が持つ唯一の提案は、独自の9つのパッチファイルを作成し、それらをアプリケーションで使用することです。

ああ、Androidの苦痛。

編集:パディングと空白の明確化。


0

このトリックは私のために働きました(min-sdk> = 18の場合)。

私が使用android:includeFontPadding="false"して、負のマージンのようなandroid:layout_marginTop="-11dp"、私の入れTextView内側A FrameLayout...または任意ののViewGroupを

ここに画像の説明を入力してください

そして最後にサンプルコード:

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

1
このトリックは、異なるフォント、サイズ、またはレイアウトでは機能しない可能性があります。
Adil Soomro

-1

これを見てください:

ImageViewをEditTextと水平方向に揃えます

EditTextの背景画像には、パディングを追加するいくつかの透明なピクセルがあるようです。

解決策は、EditTextのデフォルトの背景を別のもの(または何もないものに変更することですが、EditTextの背景はおそらく受け入れられません)です。これは、android:background XML属性を設定して行うことができます。

android:background="@drawable/myEditBackground"


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.