Android: TextView: Xóa khoảng cách và phần đệm ở trên và dưới


206

Khi tôi có TextViewmột\n trong văn bản ,, bên phải tôi có hai singleLine TextViews, một bên dưới không có khoảng cách ở giữa. Tôi đã thiết lập như sau cho cả ba TextViews.

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

Dòng đầu tiên của TextViewdòng bên trái lên hoàn hảo với trên cùng bên phải TextView.

Dòng thứ hai bên trái TextViewcao hơn một chút so với dòng thứ hai ở dưới cùng bên phải TextView.

Dường như có một số loại đệm ẩn trên đỉnh và dưới cùng của TextViews. Làm thế nào tôi có thể loại bỏ điều đó?


cố gắng đặt trọng lực của văn bản này thành centre_vertical
Dawid Hyy

Xin chào, George Bailey, Bạn có giải pháp nào sau một thời gian dài không? Tôi gặp vấn đề này quá bây giờ. Bạn có thể cho tôi giải pháp của bạn? cảm ơn.
mmm2006

1
@ mmm2006, Đã quá lâu tôi không biết mình đã làm gì. Hãy thử các giải pháp trong câu trả lời. Nếu điều đó không hiệu quả, hãy đặt một câu hỏi mới.
Trường Bryan

Điều này không hiệu quả với tôi
Marty Miller

bất kỳ câu trả lời nào dưới đây không phù hợp với tôi, bạn có thể giúp
Richa

Câu trả lời:


520
setIncludeFontPadding (boolean includepad)

hoặc trong XMLđây sẽ là:

android:includeFontPadding="false"

Đặt xem có TextViewbao gồm phần đệm trên cùng và dưới cùng để nhường chỗ cho các điểm nhấn vượt lên trên mức tăng và giảm bình thường hay không. Mặc định là đúng.


3
Nhưng dường như luôn có 1dpphần đệm trên / dưới, tôi có nhầm không? (Tôi sử dụng Developer options -> Show layout bounds)
Autobots

94
includeFontPadding="false"không loại bỏ một số không gian, nhưng không phải tất cả. rất lạ.
theblang

7
Đây có thể là một con dao hai lưỡi. includeFontPaddinglà tuyệt vời để loại bỏ bất kỳ phần đệm bổ sung nào từ chính phông chữ nhưng nó có thể gây ra sự cố trong các ngôn ngữ có phần tăng dần và giảm dần. Tôi sẽ đảm bảo nếu bạn làm điều này mà bạn kiểm tra các ngôn ngữ như tiếng Tây Ban Nha và tiếng Thái nếu bạn hỗ trợ chúng.
Elliott

3
Sau khi thiết lập thời gian chạy, nó không lấy phần đệm trên cùng nhưng phần đệm phía dưới vẫn còn đó, thậm chí cả phần đệm bên trái và bên phải? Bất kì lời đề nghị nào?
CoDe

5
Điều này đã không làm việc cho tôi. Tôi không hiểu những gì tôi đang thiếu. Tôi vẫn còn chỗ trống không mong muốn ở cuối TextView của mình
Marty Miller

41

Tôi cảm nhận được nỗi đau của bạn. Tôi đã thử mọi câu trả lời ở trên, bao gồm cảsetIncludeFontPadding sai, không làm được gì cho tôi.

Giải pháp của tôi? layout_marginBottom="-3dp"trênTextView cung cấp cho bạn một giải pháp cho phía dưới, BAM!

Mặc dù, -3dp layout_marginTopkhông thành công .... ugh.


6
Điều này có thể dẫn đến phần dưới của văn bản có khả năng bị cắt
Jason Robinson

2
Ý tưởng thực sự xấu của việc sử dụng lề âm. Tốt hơn để xem xét một chế độ xem tùy chỉnh và vẽ văn bản chính xác như bạn muốn.
Flynn81

Nếu bản vá như thế này, bạn cũng nên tính tỷ lệ kích thước phông chữ.
phnghue

37

Tôi đã tìm kiếm rất nhiều câu trả lời thích hợp nhưng không có nơi nào tôi có thể tìm thấy Câu trả lời có thể loại bỏ chính xác tất cả phần đệm khỏi TextView, nhưng cuối cùng sau khi đi qua tài liệu chính thức đã có một công việc xung quanh cho Văn bản một dòng

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

Thêm hai dòng này vào TextViewxml sẽ thực hiện công việc.
Thuộc tính thứ nhất loại bỏ phần đệm dành riêng cho dấu và thuộc tính thứ hai loại bỏ khoảng cách dành riêng để duy trì khoảng trống thích hợp giữa hai dòng văn bản.

Đảm bảo không thêm lineSpacingExtra="0dp"TextView nhiều dòng vì nó có thể khiến ngoại hình trở nên vụng về


11
thêm hai dòng này không hiệu quả với tôi và cũng không có thay đổi trong phần đệm
sunil kushwah

@sunilkushwah, nó chắc chắn sẽ hoạt động nếu bạn làm đúng cách. Rất vui lòng giúp đỡ nếu bạn có thể cung cấp thêm chi tiết về vấn đề của mình.
Mohammed Atif

@sunilkushwah Bạn có thể đẩy nó lên github và chia sẻ liên kết
Mohammed Atif

@sunilkushwah tôi thấy rằng bạn đang sử dụng Phông chữ Brandon (Phông chữ tùy chỉnh). Bạn có thể thử một lần bằng cách loại bỏ fontPaththuộc tính?
Mohammed Atif

Tôi đã thử cách này nhưng nó không hoạt động, Lưu ý: tôi không muốn bất kỳ phần đệm mặc định nào trong TextView
sunil kushwah

13

Nếu bạn sử dụng AppCompatTextView(hoặc từAPI 28 trở đi), bạn có thể sử dụng kết hợp 2 thuộc tính đó để xóa khoảng cách trên dòng đầu tiên:

XML

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

Kotlin

text.firstBaselineToTopHeight = 0
text.includeFontPadding = false

11

Điều này cũng làm tôi khó chịu và câu trả lời tôi tìm thấy là thực sự có thêm không gian trong phông chữ, không phải là TextView. Điều này khá khó chịu, đến từ một nền tảng xuất bản tài liệu, số lượng kiểm soát hạn chế mà bạn có với Android qua các yếu tố chính tả. Tôi khuyên bạn nên sử dụng một kiểu chữ tùy chỉnh (chẳng hạn như Bitstream Vera Sans, được cấp phép để phân phối lại) có thể không có vấn đề này. Tôi không chắc chắn cụ thể dù nó có hay không.


Bạn có một số phông chữ miễn phí để chỉ cho tôi? Tôi cần không có lề trên đầu mà không gán lề âm! Cảm ơn bạn!
kho tiền

11

Bạn có thể thử sử dụng thuộc tính này (ConstraintLayout):layout_constraintBaseline_toBaselineOf

Như thế này:

ứng dụng: layout_constraintBaseline_toBaselineOf = "@ + id / textView"

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


10

Tôi xóa khoảng cách trong chế độ xem tùy chỉnh của mình - NoPaddingTextView.

https://github.com/SenhLinsh/NoPaddingTextView

nhập mô tả hình ảnh ở đây

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

Đây là câu hỏi hoặc câu trả lời?
Tushar

@Tushar Đó là một câu trả lời.
Linsh

Đồng ý. Bạn có thể vui lòng thêm một số giải thích với mã ở đây.
Tushar

@Tushar Chắc chắn, nhưng nó nhiều hơn một chút.
Linsh

3
Mặc dù mã này có thể giải quyết câu hỏi, bao gồm giải thích về cách thức và lý do giải quyết vấn đề này thực sự sẽ giúp cải thiện chất lượng bài đăng của bạn (và nhận được nhiều phiếu bầu). Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai, không chỉ là người hỏi bây giờ! Vui lòng chỉnh sửa câu trả lời của bạn để thêm giải thích và đưa ra dấu hiệu về những hạn chế và giả định được áp dụng.
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>

Với một ImageView bổ sung, chúng ta có thể đặt TextView thành đường cơ sở được căn chỉnh với ImageView và đặt android:baselineAlignBottom ImageView thành true, điều này sẽ làm cho đường cơ sở của ImageView xuống dưới cùng. Các chế độ xem khác có thể tự căn chỉnh bằng cách sử dụng dưới cùng của ImageView, chính nó giống như đường cơ sở của TextView.

Điều này tuy nhiên chỉ sửa chữa phần đệm dưới chứ không phải phần trên.


hoàn hảo cho tình huống của tôi, cách tốt hơn là loại bỏ phông chữ. +1
Bawa

3

Tôi nghĩ vấn đề này có thể được giải quyết theo cách này:

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

Đó là kết quả:

Ảnh chụp màn hình-1

Ảnh chụp màn hình-3

Mặc dù dòng ký tự đặc biệt trong rightLowerText trông cao hơn một chút so với dòng thứ hai của leftText, đường cơ sở của chúng vẫn được căn chỉnh.


includeFontPadding = "false" chính xác là những gì tôi cần! Cảm ơn.
hman 18/03/18

3

Vì yêu cầu của tôi là ghi đè lên textView hiện có findViewById(getResources().getIdentifier("xxx", "id", "android"));, nên tôi không thể thử onDraw()câu trả lời khác.

Nhưng tôi chỉ tìm ra các bước chính xác để khắc phục sự cố của mình, đây là kết quả cuối cùng từ Trình kiểm tra bố cục:

nhập mô tả hình ảnh ở đây

Vì những gì tôi muốn chỉ đơn thuần là xóa các khoảng trắng trên cùng, vì vậy tôi không phải chọn phông chữ khác để xóa các khoảng trắng ở dưới cùng.

Đây là mã quan trọng để sửa nó:

Typeface mfont = Typeface.createFromAsset(getResources().getAssets(), "fonts/myCustomFont.otf");
myTextView.setTypeface(mfont);

myTextView.setPadding(0, 0, 0, 0);

myTextView.setIncludeFontPadding(false);

Khóa đầu tiên được đặt phông chữ tùy chỉnh "phông chữ / myCustomFont.otf" có khoảng trắng ở dưới nhưng không ở trên cùng, bạn có thể dễ dàng tìm ra điều này bằng cách mở tệp otf và nhấp vào bất kỳ phông chữ nào trong android Studio:

nhập mô tả hình ảnh ở đây

Như bạn có thể thấy, con trỏ ở phía dưới có khoảng cách thêm nhưng không ở trên cùng, vì vậy nó đã khắc phục vấn đề của tôi.

Khóa thứ hai là bạn không thể bỏ qua bất kỳ mã nào , nếu không nó có thể không hoạt động. Đó là lý do bạn có thể tìm thấy một số người nhận xét rằng một câu trả lời đang hoạt động và một số người khác nhận xét rằng nó không hoạt động.

Hãy minh họa những gì sẽ xảy ra nếu tôi loại bỏ một trong số chúng.

Không có setTypeface(mfont);:

nhập mô tả hình ảnh ở đây

Không có setPadding(0, 0, 0, 0);:

nhập mô tả hình ảnh ở đây

Không có setIncludeFontPadding(false);:

nhập mô tả hình ảnh ở đây

Không có 3 trong số họ (tức là bản gốc):

nhập mô tả hình ảnh ở đây



2

Phương pháp đơn giản làm việc:

setSingleLine();
setIncludeFontPadding(false);

Nếu nó không hoạt động, sau đó thử thêm mã này ở trên:

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

Nếu bạn cần nhiều dòng, có thể bạn sẽ cần tính toán chính xác chiều cao của phần đệm trên và dưới thông qua TextView một dòng tạm thời (trước và sau khi xóa phần đệm), sau đó áp dụng kết quả giảm chiều cao với phần đệm âm hoặc một số Bố cục ma với bản dịch Y. Cười lớn


1

Cập nhật XML

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

Xin chào, chào mừng bạn đến với Stack Overflow! Khi bạn trả lời một câu hỏi, bạn nên bao gồm một số loại giải thích, như những gì tác giả đã làm sai và những gì bạn đã làm để sửa nó. Tôi nói với bạn điều này bởi vì câu trả lời của bạn đã được gắn cờ là chất lượng thấp và hiện đang được xem xét. Bạn có thể chỉnh sửa câu trả lời của mình bằng cách nhấp vào nút "Chỉnh sửa".
Federico Grandi

Thực tế thay đổi android: fontF Family là không cần thiết nếu bạn đã có phông chữ chính xác. Về cơ bản android: includeFontPadding là điều duy nhất cần thiết và nó đã được đề cập trong các câu trả lời trước đó từ chuỗi.
Darek Deoniziak

@DarekDeoniziak Một số phông chữ có khoảng trắng
SJJ

0

Bạn có thể muốn thử căn chỉnh dưới cùng của chế độ xem văn bản bên trái với dưới cùng của chế độ xem văn bản bên phải thứ 2.


Nhưng sau đó, dòng trên cùng sẽ không xếp hàng. Và thực sự tôi không quan tâm đến việc họ xếp hàng nhiều như tôi thực sự muốn xóa khoảng cách.
Cánh đồng Bryan

0

Theo hiểu biết của tôi, điều này vốn có với hầu hết các vật dụng và số lượng "phần đệm" khác nhau giữa các nhà sản xuất điện thoại. Phần đệm này thực sự là khoảng trắng giữa viền hình ảnh và hình ảnh trong tệp hình ảnh vá 9.

Ví dụ, trên Droid X của tôi, các tiện ích spinner có thêm khoảng trắng so với các nút, điều này khiến bạn thấy khó xử khi bạn có một spinner nội tuyến với một nút, nhưng trên điện thoại của vợ tôi, ứng dụng tương tự không có vấn đề tương tự và trông rất tuyệt!

Gợi ý duy nhất tôi có là tạo 9 tệp vá của riêng bạn và sử dụng chúng trong ứng dụng của bạn.

Ahhh những nỗi đau đó là Android.

Chỉnh sửa: Làm rõ phần đệm vs khoảng trắng.


0

Thủ thuật này hiệu quả với tôi (với min-sdk> = 18 ).

Tôi đã sử dụng android:includeFontPadding="false"và một số dư âm như android:layout_marginTop="-11dp"và đặt TextViewbên trong của tôi FrameLayout( hoặc bất kỳ Viewgroup nào ... )

nhập mô tả hình ảnh ở đây

và cuối cùng là mã mẫu:

<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
Thủ thuật này có thể không hoạt động cho các phông chữ, kích cỡ hoặc bố cục khác nhau.
Adil Soomro

-1

Xem cái này:

Căn chỉnh ImageView với EditText theo chiều ngang

Có vẻ như hình nền của EditText có một số pixel trong suốt cũng có thêm phần đệm.

Một giải pháp là thay đổi nền mặc định của EditText thành một thứ khác (hoặc không có gì, nhưng không có nền nào cho EditText có thể không được chấp nhận). Điều đó có thể được thực hiện khi thiết lập android: thuộc tính XML nền.

android:background="@drawable/myEditBackground"


-5

Sử dụng cái này trong ImageView xml của bạn

android: điều chỉnhViewBound = "true"


Vui lòng thêm một số lời giải thích về điều đó
Nico Haase

tôi nghĩ rằng điều này phải được hiểu. Tôi chỉ có thể được sử dụng trong xml.
Anshul Rawat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.