안드로이드 : TextView : 상단과 하단의 간격과 패딩 제거


208

텍스트에 TextViewa 가 있으면 \n오른쪽 singleLine TextView에 사이에 간격이없는 두 개의 s가 있습니다. 세 가지 모두에 대해 다음을 설정했습니다 TextView.

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

왼쪽의 첫 번째 줄은 TextView오른쪽 위와 완벽하게 정렬 TextView됩니다.

왼쪽 TextView의 두 번째 줄은 오른쪽 아래의 두 번째 줄보다 약간 높습니다 TextView.

TextViews 의 상단과 하단에 숨겨진 패딩이있는 것 같습니다 . 어떻게 제거 할 수 있습니까?


center_vertical이 텍스트 뷰의 세트 중력 시도
DAWID Hyży에게

안녕, 조지 베일리, 오랜만에 해결책이 있니? 지금도이 문제가 발생합니다. 나에게 해결책을 줄 수 있습니까? 감사.
mmm2006

1
@ mmm2006, 너무 오래되어서 내가 무엇을했는지 모르겠습니다. 답변에서 해결책을 시도하십시오. 그래도 문제가 해결되지 않으면 새로운 질문을하십시오.
Bryan Field

이것은 나를 위해 작동하지 않았다
Marty Miller

아래 답변 중 하나라도 저에게 효과가 없었습니다. 도와 줄 수 있습니까
Richa

답변:


520
setIncludeFontPadding (boolean includepad)

또는 XML이것은 :

android:includeFontPadding="false"

TextView정상 상승 및 하강을 초과하는 악센트를위한 공간을 만들기 위해 추가 상단 및 하단 패딩 포함 여부를 설정합니다 . 기본값은 true입니다.


3
그러나 항상 보이는이 1dp잘못 난 오전, 위 / 아래 패딩을 (내가 사용? Developer options -> Show layout bounds)
오토봇

94
includeFontPadding="false"일부 공간을 제거하지만 모든 공간을 제거하지는 않습니다. 아주 이상한.
theblang

7
이것은 양날의 칼일 수 있습니다. includeFontPadding글꼴 자체에서 추가 패딩을 제거하는 데 유용하지만 오름차순 및 내림차순이있는 언어에서는 문제가 발생할 수 있습니다. 지원하는 경우 스페인어 및 태국어와 같은 언어를 테스트하도록이 작업을 수행해야합니다.
Elliott

3
런타임을 설정 한 후 상단 패딩이 아니라 하단 패딩이 여전히 왼쪽 및 오른쪽 패딩을 사용합니까? 어떠한 제안?
CoDe

5
이것은 나를 위해 작동하지 않았습니다. 내가 잃어버린 것을 이해하지 못합니다. 여전히 TextView 하단에 원치 않는 공간이 있습니다
Marty Miller

41

나도 네 아픔을 느낀다. 위의 모든 대답을 시도했지만 setIncludeFontPaddingto ~ false를 포함하여 아무것도하지 않았습니다.

내 솔루션? layout_marginBottom="-3dp"TextView바닥에 대한 솔루션을 제공합니다, BAM!

-3dp on에 layout_marginTop실패 하지만 .... ugh.


6
이로 인해 텍스트의 맨 아래가 잘릴 수 있습니다.
Jason Robinson

2
부정적인 마진을 사용하는 것은 정말 나쁜 생각입니다. 사용자 정의보기를 고려하고 원하는대로 정확하게 텍스트를 그립니다.
Flynn81

패치가 이와 같은 경우 글꼴 크기의 비율도 계산해야합니다.
phnghue

37

나는 적절한 답변을 많이 찾았지만에서 모든 패딩을 정확하게 제거 할 수있는 답변을 찾을 수있는 곳은 TextView없었지만 공식 문서를 거친 후에 는 한 줄짜리 텍스트에 대한 해결책을 얻었습니다.

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

이 두 줄을 TextViewxml에 추가 하면 효과가 있습니다.
첫 번째 특성은 악센트에 예약 된 패딩을 제거하고 두 번째 특성은 두 줄의 텍스트 사이에 적절한 공간을 유지하기 위해 예약 된 간격을 제거합니다.

여러 lineSpacingExtra="0dp"줄로 된 TextView 를 추가하지 마십시오.


11
이 두 줄을 추가해도 효과가 없으며 패딩에는 변화가 없습니다.
sunil kushwah

@ sunilkushwah, 제대로 수행하면 확실히 작동합니다. 문제에 대한 자세한 내용을 제공 할 수 있다면 기꺼이 도와 드리겠습니다.
Mohammed Atif

@sunilkushwah 아마 github에서 푸시하고 링크를 공유 할 수 있습니다
Mohammed Atif

@ sunilkushwah 나는 Brandon Font (Custom Font)를 사용하고 있음을 알았습니다. fontPath속성 을 제거하여 한 번 시도해 볼 수 있습니까 ?
Mohammed Atif

나는 이것을 시도했지만 작동하지 않습니다. 참고 : TextView에서 기본 패딩을 원하지 않습니다
sunil kushwah

14

를 사용하는 경우 AppCompatTextView(또는 그 API 28이후부터) 두 속성의 조합을 사용하여 첫 번째 줄의 간격을 제거 할 수 있습니다.

XML

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

코 틀린

text.firstBaselineToTopHeight = 0
text.includeFontPadding = false

11

이것은 나에게도 화가 났으며, 내가 찾은 대답은 실제로 TextView가 아닌 ​​글꼴 자체에 추가 공간이 있다는 것입니다. 문서 출판 배경에서 볼 때 안드로이드를 통해 타이포그래피 요소에 대해 제한적인 제어를하는 것은 다소 짜증납니다. 이 문제가 없을 수있는 사용자 지정 서체 (예 : 재배포가 허가 된 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

확인. 코드로 설명을 추가해 주시겠습니까?
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

스크린 샷 -3

rightLowerText의 특수 문자 행이 leftText의 두 번째 행보다 약간 더 높게 보이지만 기준선은 여전히 ​​정렬되어 있습니다.


includeFontPadding = "false"는 정확히 내가 필요한 것입니다! 감사.
hman

3

내 요구 사항은 기존 textView get from을 무시 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

업데이트 된 XML

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

안녕하세요, Stack Overflow에 오신 것을 환영합니다! 질문에 대답 할 때 저자가 잘못한 것과 수정 한 것과 같은 일종의 설명을 포함해야합니다. 귀하의 답변이 품질이 낮은 것으로 표시되어 현재 검토 중이므로이 정보를 알려드립니다. "편집"버튼을 클릭하여 답변을 편집 할 수 있습니다 .
Federico Grandi

이미 올바른 글꼴을 가지고 있다면 실제로 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

왼쪽 텍스트보기의 아래쪽을 두 번째 오른쪽 텍스트보기의 아래쪽에 맞추려고 할 수 있습니다.


그러나 최상위 줄은 정렬되지 않습니다. 그리고 실제로 간격을 제거하고 싶을 때만 큼 정렬하지는 않습니다.
Bryan Field

0

내 지식으로는 이것은 대부분의 위젯에 내재되어 있으며 "패딩"의 양은 전화 제조업체마다 다릅니다. 이 패딩은 실제로 이미지 패치와 9 패치 이미지 파일의 이미지 사이에 공백입니다.

예를 들어 내 Droid X에서 스피너 위젯에는 버튼보다 여분의 공백이 생겨 버튼과 함께 인라인 스피너가 있으면 어색해 보이지만 아내의 전화에서 동일한 응용 프로그램에 동일한 문제가 없으며 멋지게 보입니다!

내가 가질 수있는 유일한 제안은 자신의 9 패치 파일을 만들어 응용 프로그램에서 사용하는 것입니다.

안드로이드의 고통을 아아.

편집 : 패딩 대 공백.


0

이 트릭은 나를 위해 일했습니다 ( min-sdk> = 18 ).

내가 사용 android:includeFontPadding="false"하고 부정적인 마진 같은 android:layout_marginTop="-11dp"과 내 넣어 TextView내부를 FrameLayout( 또는 뷰 그룹 ... )

여기에 이미지 설명을 입력하십시오

마지막으로 샘플 코드 :

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


-5

이것을 ImageView xml에서 사용하십시오.

android : adjustViewBounds = "true"


이에 대한 설명을 추가하십시오
Nico Haase

나는 이것이 이해되어야한다고 생각했다. 나는 xml에서만 사용할 수 있습니다.
Anshul Rawat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.