programing

Android:텍스트 보기:상단 및 하단의 간격 및 패딩 제거

padding 2023. 8. 26. 10:32
반응형

Android:텍스트 보기:상단 및 하단의 간격 및 패딩 제거

내가 있을 때.TextView\n본문에서 오른쪽에 두 개가 있습니다.singleLine TextViews, 간을두지않하아고놓래입에다니씩나격▁s놓다.는 이 세 가지 설정했습니다.TextViews의

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

의 첫 은 의첫번째줄쪽왼▁the줄입니다.TextView합니다.TextView.

왼쪽의 두 번째 줄TextView는 오른쪽 의 두 더 .TextView.

상의와 하의에 일종의 숨겨진 패딩이 있는 것 같습니다.TextView그것을 어떻게 제거할 수 있습니까?

setIncludeFontPadding (boolean includepad)

또는 안에XML이는 다음과 같습니다.

android:includeFontPadding="false"

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

위해 에서도 정확하게 할 수 수 .TextView하지만 마침내 공식적인 의사를 거친 후에 한 문자에 대한 작업을 얻었습니다.

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

두을 이두줄에 추가하는 입니다.TextViewxml 파일을 합니다.
첫 번째 속성은 악센트를 위해 예약된 패딩을 제거하고 두 번째 속성은 두 줄의 텍스트 사이에 적절한 공간을 유지하기 위해 예약된 간격을 제거합니다.

추하지마오시십가를 추가하지 않도록 .lineSpacingExtra="0dp"해질 수 TextView는 TextView입니다.

당신의 고통을 느낍니다.저는 위의 모든 답변을 시도했습니다.setIncludeFontPadding거짓으로, 그것은 나에게 아무런 도움이 되지 않았습니다.

나의 해결책?layout_marginBottom="-3dp"에서.TextView을 드립니다,! 대해드을립다니책결한바에닥, BAM!

on 하만지, -3dpon.layout_marginTop... 실패... 실패.

다음 특성(ConstraintLayout)을 사용할 수 있습니다.layout_constraintBaseline_toBaselineOf

다음과 같이:

앱:layout_constraintBaseline_toBaselineOf="@+id/textView"

enter image description here

enter image description here

업데이트된 XML

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

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

XML

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

코틀린

text.firstBaselineToTopHeight = 0
text.includeFontPadding = false

Android 추가: fontPadding="false"를 포함하여 도움이 되는지 확인합니다.또한 텍스트 보기 크기를 "랩 내용"이 아닌 텍스트 크기와 동일하게 만듭니다.그것은 틀림없이 효과가 있을 것입니다.

이것도 저를 짜증나게 했고, 제가 찾은 답은 실제로는 TextView가 아닌 글꼴 자체에 추가 공간이 있다는 것이었습니다.문서 게시 배경에서 오는 타이포그래피 요소에 대한 Android의 제한된 제어 능력은 다소 짜증이 납니다.이 문제가 없을 수도 있는 사용자 지정 서체(예: 재배포용으로 라이센스가 부여된 Bitstream Vera Sans)를 사용하는 것이 좋습니다.하지만 구체적으로 그렇게 되는지는 잘 모르겠습니다.

사용자 정의 보기에서 공백을 제거합니다. - 추가할 텍스트 보기 없음.

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

내 요구 사항은 기존 텍스트를 재정의하는 것이기 때문에 다음에서 가져오기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"로 설정됩니다. "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

<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:baselineAlignBottomImageView의 기준선이 아래로 이동합니다.다른 보기는 TextView의 기준선과 동일한 ImageView의 하단을 사용하여 자신을 정렬할 수 있습니다.

그러나 이것은 패딩 바닥만 고정하고 상단은 고정하지 않습니다.

이 문제는 다음과 같은 방법으로 해결할 수 있다고 생각합니다.

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

결과는 다음과 같습니다.

스크린샷-1

스크린샷-3

오른쪽 하단의 특수 문자 라인은텍스트가 왼쪽의 두 번째 줄보다 조금 더 높아 보입니다.텍스트: 기준선이 정렬되어 있습니다.

간단한 방법 사용:

setSingleLine();
setIncludeFontPadding(false);

작동하지 않는 경우 코드 위에 다음을 추가합니다.

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

다중 라인이 필요한 경우, 임시 단일 라인 TextView(패딩 제거 전후)를 통해 패딩 상단과 하단의 높이를 정확하게 계산한 다음 음의 패딩 또는 번역 Y가 있는 일부 고스트 레이아웃으로 높이 감소 결과를 적용해야 할 수 있습니다. Lol

유일하게 성공한 것은

android:lineSpacingExtra="-8dp"

여기 나열된 일부 해킹(음의 여백, 글꼴 패딩 등)으로 이 문제를 부분적으로 해결할 수는 있지만 글꼴 자체의 크기는 파악할 수 없습니다[1].글꼴의 각 "셀"의 고정 높이는 모든 언어에서 가장 큰 문자를 수용할 수 있을 정도로 커야 합니다.

다른 답변에 나열된 해킹을 사용하면 글꼴을 잘라낼 수 있습니다.

해결책은 디자이너들에게 이렇게 글꼴이 패키징되는 방식을 설명하고 디자이너들이 디자인에서 이를 설명하도록 하는 것입니다.다른 언어로 번역될 때 버그를 처리하기 위해 지금 해킹하지 마십시오.

압축된 오름차순과 내림차순으로 자체 글꼴을 패키지화할 수 있을 것으로 생각합니다.

왼쪽 텍스트 보기의 아래쪽과 두 번째 오른쪽 텍스트 보기의 아래쪽을 정렬해 보는 것이 좋습니다.

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

예를 들어, 내 Droid X에서 스피너 위젯은 버튼보다 더 많은 공간을 차지하기 때문에 버튼이 있는 스피너가 있을 때 어색해 보이지만, 내 아내의 전화기에서는 동일한 애플리케이션에 동일한 문제가 없고 멋져 보입니다!

제가 제안할 수 있는 유일한 방법은 9개의 패치 파일을 만들어 당신의 애플리케이션에 사용하는 것입니다.

아, 안드로이드의 고통입니다.

편집: 패딩 대 공백을 명확하게 합니다.

이 트릭은 저에게 효과가 있었습니다(min-filen >= 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>

제약 조건 레이아웃을 루트 보기로 사용한 다음 가이드라인 도우미를 추가합니다.

예:

<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 값은 사용자의 필요에 따라 달라집니다.

이것은 저에게 효과가 있었습니다.

android:minHeight="0dp"

다음 특성(ConstraintLayout)을 사용할 수 있습니다.layout_constraintBaseline_toBaselineOf

imageView가 Textview 텍스트의 기준선 하단에서 시작되는 아래 XML 파일에서 참조할 수 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <ImageView
        android:id="@+id/imageViewHello"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/img_star_05"
        android:baselineAlignBottom="true"
        android:layout_alignBaseline="@+id/textViewHello"
        android:layout_toRightOf="@+id/textViewHello"
        android:layout_toEndOf="@+id/textViewHello" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Text"
        android:id="@+id/textViewHello"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

</RelativeLayout>

또는 대부분의 사용 사례에서 아래 코드를 텍스트 보기에 넣을 수 있도록 이미지 보기의 하단을 기준선에 맞춰야 합니다.

android:layout_alignBaseline="@+id/imageViewHello"

참조:

이미지 보기를 텍스트 편집과 수평으로 정렬

EditText의 배경 이미지에는 패딩을 추가하는 투명 픽셀이 몇 개 있는 것 같습니다.

해결 방법은 EditText의 기본 배경을 다른 배경으로 변경하는 것입니다(또는 없음). 그러나 EditText의 배경은 허용되지 않을 수 있습니다.이것은 Android:background XML 속성을 설정하도록 만들 수 있습니다.

android:background="@drawable/myEditBackground"

나한테 효과가 있어요.

텍스트 보기에 두 줄만 추가합니다.

 android:includeFontPadding="false"
 android:lineSpacingMultiplier="0.8"
<TextView
            android:id="@+id/searchByItemTv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:fontFamily="@font/dm_sans"
            android:includeFontPadding="false"
            android:lineSpacingMultiplier="0.8"
            android:paddingVertical="3dp"
            android:paddingStart="4dp"
            android:paddingEnd="6dp"
            android:text="@string/date_of_birth"
            android:textColor="@color/text_black"
            android:textSize="16dp" />

안 함: 사용 안 함android:textAppearance=""

ImageView xml에서 사용합니다.

Android:viewBounds 조정="true"

언급URL : https://stackoverflow.com/questions/4768738/android-textview-remove-spacing-and-padding-on-top-and-bottom

반응형