Android: TextView: Hapus spasi dan bantalan di bagian atas dan bawah

208

Ketika saya memiliki TextViewdengan \ndalam teks ,, di sebelah kanan saya memiliki dua singleLine TextView, satu di bawah yang lain tanpa spasi di antaranya. Saya telah menetapkan yang berikut untuk ketiganya TextView.

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

Baris pertama dari TextViewgaris kiri naik dengan sempurna dengan kanan atas TextView.

Baris kedua kiri TextViewsedikit lebih tinggi dari baris kedua kanan bawah TextView.

Tampaknya ada semacam bantalan tersembunyi di bagian atas dan bawah TextViews. Bagaimana saya bisa menghapusnya?

Bryan Field
sumber
coba atur gravitasi tampilan teks ini ke center_vertical
Dawid Hyży
Hai, George Bailey, Apakah Anda punya solusi setelah sekian lama? Saya menghadapi masalah ini juga sekarang. Bisakah Anda memberi saya solusi? Terima kasih.
mmm2006
1
@ mmm2006, Sudah begitu lama saya tidak tahu apa yang akhirnya saya lakukan. Coba solusi dalam jawabannya. Jika itu tidak berhasil, buat pertanyaan baru.
Lapangan Bryan
Ini tidak berhasil untuk saya
Marty Miller
salah satu jawaban di bawah ini tidak berfungsi untuk saya, dapatkah Anda membantu
Richa

Jawaban:

521
setIncludeFontPadding (boolean includepad)

atau XMLini akan menjadi:

android:includeFontPadding="false"

Tetapkan apakah TextViewtermasuk padding ekstra atas dan bawah untuk memberikan ruang bagi aksen yang melampaui pendakian dan penurunan normal. Default-nya benar.

pengguna634545
sumber
3
Tapi sepertinya selalu memiliki 1dpbantalan atas / bawah, apakah saya salah? (Saya menggunakan Developer options -> Show layout bounds)
Autobots
94
includeFontPadding="false"memang menghapus beberapa ruang, tetapi tidak semuanya. sangat aneh.
theblang
7
Ini bisa menjadi pedang bermata dua. includeFontPaddingsangat bagus untuk menghapus padding tambahan dari font itu sendiri tetapi dapat menyebabkan masalah dalam bahasa yang memiliki ascenders dan descenders. Saya akan memastikan jika Anda melakukan ini Anda menguji bahasa seperti Spanyol dan Thailand jika Anda mendukungnya.
Elliott
3
Setelah pengaturan runtime itu tidak mengambil bantalan atas tetapi bantalan bawah masih ada, bahkan bantalan kiri dan kanan juga? ada saran?
CoDe
5
Ini tidak berhasil untuk saya. Saya tidak mengerti apa yang saya lewatkan. Saya masih memiliki ruang yang tidak diinginkan di bagian bawah TextView saya
Marty Miller
41

Aku merasakan sakitmu. Saya sudah mencoba setiap jawaban di atas, termasuk setIncludeFontPaddingke false, yang tidak membantu saya.

Solusi saya? layout_marginBottom="-3dp"pada bagian TextViewmemberi Anda solusi untuk bagian bawah, BAM!

Meskipun, -3dp aktif layout_marginTopgagal .... ugh.

hunterp
sumber
6
Ini dapat mengarah ke bagian bawah teks yang berpotensi terpotong
Jason Robinson
2
Gagasan buruk menggunakan margin negatif. Lebih baik mempertimbangkan tampilan khusus dan menggambar teks persis seperti yang Anda inginkan.
Flynn81
Jika tambalan seperti ini, Anda harus menghitung rasio ukuran font juga.
phnghue
37

Saya mencari banyak jawaban yang tepat tetapi tidak ada tempat saya dapat menemukan Jawaban yang bisa menghilangkan semua padding dari TextView, tetapi akhirnya setelah melalui dokumen resmi mendapat pekerjaan untuk Single Line Texts

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

Menambahkan dua baris ini ke TextViewxml akan berhasil.
Atribut pertama menghilangkan padding yang dicadangkan untuk aksen dan atribut kedua menghilangkan spasi yang disediakan untuk mempertahankan ruang yang tepat di antara dua baris teks.

Pastikan untuk tidak menambahkan lineSpacingExtra="0dp"TextView multiline karena dapat membuat penampilan menjadi kikuk

Mohammed Atif
sumber
11
menambahkan dua baris ini tidak bekerja untuk saya dan juga tidak ada perubahan padding
sunil kushwah
@sunilkushwah, itu pasti akan berfungsi jika Anda melakukannya dengan benar. Dengan senang hati akan membantu jika Anda dapat memberikan rincian lebih lanjut tentang masalah Anda.
Mohammed Atif
@sunilkushwah Anda mungkin dapat mendorongnya di github dan membagikan tautan
Mohammed Atif
@sunilkushwah saya melihat bahwa Anda menggunakan Brandon Font (Custom Font). Bisakah Anda mencoba menghapus fontPathatribut?
Mohammed Atif
saya mencoba ini tetapi tidak berfungsi, Catatan: saya tidak ingin ada padding default di TextView
sunil kushwah
14

Jika Anda menggunakan AppCompatTextView(atau dari API 28depan), Anda dapat menggunakan kombinasi kedua atribut tersebut untuk menghapus spasi di baris pertama:

XML

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

Kotlin

text.firstBaselineToTopHeight = 0
text.includeFontPadding = false
Mario Lenci
sumber
11

Ini mengganggu saya juga, dan jawaban yang saya temukan adalah bahwa sebenarnya ada ruang tambahan di font itu sendiri, bukan TextView. Agak menyebalkan, berasal dari latar belakang penerbitan dokumen, terbatasnya kontrol yang Anda miliki dengan Android atas elemen tipografi. Saya akan merekomendasikan menggunakan jenis huruf khusus (seperti Bitstream Vera Sans, yang dilisensikan untuk redistribusi) yang mungkin tidak memiliki masalah ini. Saya tidak yakin secara spesifik apakah itu benar atau tidak.

Kevin Coppock
sumber
apakah Anda memiliki font gratis untuk mengarahkan saya? Saya tidak perlu margin di atas tanpa menetapkan margin negatif! Terima kasih!
lemari besi
11

Anda dapat mencoba menggunakan atribut ini (ConstraintLayout):layout_constraintBaseline_toBaselineOf

Seperti ini:

app: layout_constraintBaseline_toBaselineOf = "@ + id / textView"

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

batang angin
sumber
10

Saya menghapus spasi dalam tampilan kustom saya - NoPaddingTextView.

https://github.com/SenhLinsh/NoPaddingTextView

masukkan deskripsi gambar di sini

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;
    }
}
Linsh
sumber
Apakah ini pertanyaan atau jawaban?
Tushar
@ Tushar Ini jawaban.
Linsh
Baik. Bisakah Anda menambahkan penjelasan dengan kode di sini.
Tushar
@ Tushar Tentu, tapi sedikit lebih.
Linsh
3
Sementara kode ini dapat menyelesaikan pertanyaan, termasuk penjelasan tentang bagaimana dan mengapa ini menyelesaikan masalah akan sangat membantu untuk meningkatkan kualitas posting Anda (dan mendapatkan suara). Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, bukan hanya orang yang bertanya sekarang! Harap edit jawaban Anda untuk menambahkan penjelasan, dan berikan indikasi batasan dan asumsi apa yang berlaku.
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>

Dengan ImageView tambahan kita dapat mengatur TextView menjadi garis dasar sejajar dengan ImageView dan mengatur android:baselineAlignBottompada ImageView menjadi true, yang akan membuat garis dasar ImageView ke bawah. Tampilan lain dapat menyelaraskan dirinya menggunakan bagian bawah ImageView yang itu sendiri sama dengan garis dasar TextView.

Namun ini hanya memperbaiki bagian bawah bantalan bukan bagian atas.

Viven
sumber
sempurna untuk situasi saya, jauh lebih baik daripada menghapus font padding. +1
Bawa
3

Saya pikir masalah ini dapat diselesaikan dengan cara ini:

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

Itulah hasilnya:

ScreenShot-1

ScreenShot-3

Meskipun garis karakter khusus di rightLowerText terlihat sedikit lebih tinggi daripada baris kedua dari leftText, garis dasarnya tetap sejajar.

Wei Wei
sumber
includeFontPadding = "false" adalah persis apa yang saya butuhkan! Terima kasih.
hman
3

Karena persyaratan saya menggantikan textView yang ada findViewById(getResources().getIdentifier("xxx", "id", "android"));, maka saya tidak bisa mencoba onDraw()jawaban lain.

Tapi saya baru saja mencari tahu langkah yang tepat untuk memperbaiki masalah saya, berikut ini adalah hasil akhir dari Inspektur Tata Letak:

masukkan deskripsi gambar di sini

Karena yang saya inginkan hanyalah menghapus spasi teratas, jadi saya tidak perlu memilih font lain untuk menghapus spasi bawah.

Ini kode penting untuk memperbaikinya:

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

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

myTextView.setIncludeFontPadding(false);

Kunci pertama adalah mengatur font "fonts / myCustomFont.otf" khusus yang memiliki ruang di bagian bawah tetapi tidak di bagian atas, Anda dapat dengan mudah mengetahuinya dengan membuka file otf dan mengklik font apa saja di android Studio:

masukkan deskripsi gambar di sini

Seperti yang Anda lihat, kursor di bagian bawah memiliki spasi tambahan tetapi tidak di bagian atas, jadi itu memperbaiki masalah saya.

Kunci kedua adalah Anda tidak bisa melewatkan kode apa pun , jika tidak, kode itu mungkin tidak berfungsi. Itulah alasan Anda dapat menemukan beberapa orang berkomentar bahwa jawaban itu berfungsi dan beberapa orang lain berkomentar bahwa itu tidak berfungsi.

Mari kita ilustrasikan apa yang akan terjadi jika saya menghapus salah satunya.

Tanpa setTypeface(mfont);:

masukkan deskripsi gambar di sini

Tanpa setPadding(0, 0, 0, 0);:

masukkan deskripsi gambar di sini

Tanpa setIncludeFontPadding(false);:

masukkan deskripsi gambar di sini

Tanpa 3 dari mereka (yaitu yang asli):

masukkan deskripsi gambar di sini

Buah
sumber
3

Satu-satunya hal yang berhasil adalah

android:lineSpacingExtra="-8dp"
Antonis Radz
sumber
3

XML yang diperbarui

android:fontFamily="monospace"
android:includeFontPadding="false"
SJJ
sumber
Hai, selamat datang di Stack Overflow! Ketika Anda menjawab pertanyaan, Anda harus memasukkan semacam penjelasan, seperti apa yang salah penulis dan apa yang Anda lakukan untuk memperbaikinya. Saya memberi tahu Anda ini karena jawaban Anda telah ditandai sebagai berkualitas rendah dan saat ini sedang ditinjau. Anda dapat mengedit jawaban Anda dengan mengeklik tombol "Edit".
Federico Grandi
Sebenarnya mengubah android: fontFamily tidak perlu jika Anda sudah memiliki font yang benar. Pada dasarnya android: includeFontPadding adalah satu-satunya yang diperlukan dan telah disebutkan dalam jawaban sebelumnya dari utas.
Darek Deoniziak
@DarekDeoniziak Beberapa font memiliki spasi
SJJ
2

Metode sederhana berhasil:

setSingleLine();
setIncludeFontPadding(false);

Jika tidak berhasil, cobalah untuk menambahkan ini di atas kode itu:

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

Jika Anda membutuhkan multi baris, mungkin Anda harus menghitung dengan tepat tinggi bantalan atas dan bawah melalui temp satu baris TextView (sebelum dan sesudah menghapus bantalan), lalu menerapkan penurunan hasil tinggi dengan bantalan negatif atau beberapa Tata Letak Hantu dengan menerjemahkan Y. Lol

Phnghue
sumber
0

Anda mungkin ingin mencoba menyelaraskan bagian bawah tampilan teks kiri dengan bagian bawah tampilan teks kanan ke-2.

Jems
sumber
Tetapi kemudian garis atas tidak akan berbaris. Dan sebenarnya saya tidak peduli tentang mereka berbaris sebanyak yang saya benar-benar ingin menghapus spasi.
Lapangan Bryan
0

Sepengetahuan saya ini melekat pada sebagian besar widget dan jumlah "padding" berbeda di antara produsen ponsel. Padding ini benar-benar ruang putih antara batas gambar dan gambar di file gambar 9 patch.

Sebagai contoh pada Droid X saya, widget pemintal mendapatkan ruang putih ekstra dari tombol, yang membuatnya terlihat canggung ketika Anda memiliki pemintal segaris dengan sebuah tombol, namun pada telepon istri saya aplikasi yang sama tidak memiliki masalah yang sama dan tampak hebat!

Satu-satunya saran yang saya miliki adalah membuat 9 file tambalan Anda sendiri dan menggunakannya dalam aplikasi Anda.

Ahhh rasa sakit itu adalah Android.

Diedit: Clarify padding vs white space.

pengguna432209
sumber
0

Trik ini berhasil untuk saya (untuk min-SDK> = 18 ).

Saya menggunakan android:includeFontPadding="false"dan margin negatif suka android:layout_marginTop="-11dp"dan meletakkan TextViewbagian dalam saya FrameLayout( atau ViewGroup lainnya ... )

masukkan deskripsi gambar di sini

dan akhirnya kode sampel:

<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>
Richi
sumber
1
Trik ini mungkin tidak berfungsi untuk font, ukuran, atau tata letak yang berbeda.
Adil Soomro
-1

Lihat ini:

Luruskan ImageView dengan EditText secara horizontal

Tampaknya gambar latar belakang EditText memiliki beberapa piksel transparan yang juga menambahkan padding.

Solusi adalah mengubah latar belakang default EditText ke sesuatu yang lain (atau tidak sama sekali, tetapi tidak ada latar belakang untuk EditText mungkin tidak dapat diterima). Itu bisa dibuat pengaturan android: atribut XML latar belakang.

android:background="@drawable/myEditBackground"
Ixx
sumber
-2

Cukup gunakan

android:padding="0dp"
Juan Bernal
sumber
-5

Gunakan ini di ImageView xml Anda

android: adjustViewBounds = "true"

Anshul Rawat
sumber
Silakan tambahkan beberapa penjelasan tentang itu
Nico Haase
Saya pikir ini harus dipahami. Saya hanya bisa digunakan dalam xml.
Anshul Rawat