Android:텍스트 보기:상단 및 하단의 간격 및 패딩 제거
내가 있을 때.TextView
\n
본문에서 오른쪽에 두 개가 있습니다.singleLine
TextView
s, 간을두지않하아고놓래입에다니씩나격▁s놓다.는 이 세 가지 설정했습니다.TextView
s의
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"
두을 이두줄에 추가하는 입니다.TextView
xml 파일을 합니다.
첫 번째 속성은 악센트를 위해 예약된 패딩을 제거하고 두 번째 속성은 두 줄의 텍스트 사이에 적절한 공간을 유지하기 위해 예약된 간격을 제거합니다.
추하지마오시십가를 추가하지 않도록 .
lineSpacingExtra="0dp"
해질 수 TextView는 TextView입니다.
당신의 고통을 느낍니다.저는 위의 모든 답변을 시도했습니다.setIncludeFontPadding
거짓으로, 그것은 나에게 아무런 도움이 되지 않았습니다.
나의 해결책?layout_marginBottom="-3dp"
에서.TextView
을 드립니다,! 대해드을립다니책결한바에닥, BAM!
on 하만지, -3dpon.layout_marginTop
... 실패... 실패.
다음 특성(ConstraintLayout)을 사용할 수 있습니다.layout_constraintBaseline_toBaselineOf
다음과 같이:
앱:layout_constraintBaseline_toBaselineOf="@+id/textView"
업데이트된 XML
android:fontFamily="monospace"
android:includeFontPadding="false"
를 사용하는 경우(또는 에서)API 28
forward ) 이두하여 첫 줄의 할 수 . 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
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()
다른 대답의
하지만 저는 문제를 해결하기 위한 올바른 단계를 찾을 뿐입니다. 여기 레이아웃 검사기의 최종 결과가 나와 있습니다.
제가 원했던 것은 맨 위 공간을 제거하는 것이기 때문에 맨 아래 공간을 제거하기 위해 다른 글꼴을 선택할 필요가 없습니다.
이 문제를 해결하기 위한 중요 코드는 다음과 같습니다.
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에서 원하는 글꼴을 클릭하면 쉽게 확인할 수 있습니다.
보시는 것처럼 하단의 커서는 간격이 있지만 상단이 아닌 부분이 있어서 제 문제를 해결했습니다.
두 번째 핵심은 코드를 그냥 건너뛸 수 없다는 것입니다. 그렇지 않으면 작동하지 않을 수도 있습니다.그렇기 때문에 어떤 사람들은 답이 효과가 있다고 말하고 어떤 사람들은 그것이 효과가 없다고 말하는 것을 발견할 수 있습니다.
그 중 하나를 제거하면 어떤 일이 발생하는지 설명하겠습니다.
없이.setTypeface(mfont);
:
없이.setPadding(0, 0, 0, 0);
:
없이.setIncludeFontPadding(false);
:
이 중 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
ImageView의 기준선이 아래로 이동합니다.다른 보기는 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" />
결과는 다음과 같습니다.
오른쪽 하단의 특수 문자 라인은텍스트가 왼쪽의 두 번째 줄보다 조금 더 높아 보입니다.텍스트: 기준선이 정렬되어 있습니다.
간단한 방법 사용:
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...)
마지막으로 샘플 코드:
<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
'programing' 카테고리의 다른 글
애플리케이션 상태 점검을 위해 /healthz를 사용하는 관습은 어디에서 유래되었습니까? (0) | 2023.08.26 |
---|---|
schema_version에 선택 권한이 없습니까? (0) | 2023.08.26 |
용기를 멈추지 않고 분리하는 올바른 방법 (0) | 2023.08.26 |
각 루프에서 프로그램 실행 (0) | 2023.08.26 |
jQuery를 사용하여 요소를 뷰로 스크롤하려면 어떻게 해야 합니까? (0) | 2023.08.26 |