Android: TextView: Üst ve alttaki boşlukları ve dolguları kaldırın


208

Metinde bir TextViewile bir olduğunda \n, sağda singleLine TextView, aralarında boşluk olmadan, diğerinin altında iki s var . Üç TextViews için de aşağıdakileri ayarladım .

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

Solun ilk satırı TextViewsağ üst ile mükemmel bir şekilde hizalanır TextView.

Solun ikinci çizgisi, TextViewsağ alttaki ikinci çizgiden biraz daha yüksektir TextView.

Görünüşe göre TextViews'nin üstünde ve altında gizli bir dolgu var . Bunu nasıl kaldırabilirim?


Bu metin görüntüsünün yerçekimini center_vertical olarak ayarlamaya çalışın
Dawid Hyży

Merhaba George Bailey, Uzun zaman sonra çözümün var mı? Ben de şimdi bu problemle karşılaşıyorum. Bana çözümünüzü verir misiniz? Teşekkürler.
mmm2006

1
@ mmm2006, Çok uzun zamandan beri ne yaptığımı bilmiyorum. Cevaplardaki çözümleri deneyin. Bu işe yaramazsa, yeni bir soru sorun.
Bryan Field

Bu benim için işe yaramadı
Marty Miller

aşağıdaki cevaplardan herhangi biri benim için işe yaramadı, yardımcı olabilir
Richa

Yanıtlar:


520
setIncludeFontPadding (boolean includepad)

ya da XMLbu şöyle olur:

android:includeFontPadding="false"

TextViewNormal yükseliş ve alçalmanın üzerine çıkan aksanlara yer açmak için ekstra üst ve alt dolgu içerip içermediğini ayarlayın . Varsayılan değer true.


3
Ama her zaman görünen bir vardır 1dpyanlış öyleyim, üst / alt dolgu (kullandığım? Developer options -> Show layout bounds)
Autobots

94
includeFontPadding="false"alanın bir kısmını kaldırır, ancak tümünü kaldırmaz. çok ilginç.
theblang

7
Bu iki ucu keskin bir kılıç olabilir. includeFontPaddingyazı tipinin kendisinden ek dolguları kaldırmak için harikadır, ancak yükselen ve azalan dillerde olan sorunlara neden olabilir. Bunu yaparsanız, İspanyolca ve Tay dili gibi dilleri desteklediğinizde test ettiğinizden emin olurum.
Elliott

3
Çalışma zamanını ayarladıktan sonra üst dolgu almıyor, ancak alt dolgu hala orada, sol ve sağ dolgu da var mı? herhangi bir öneri?
CoDe

5
Bu benim için işe yaramadı. Neyi kaçırdığımı anlamıyorum. Hala TextView'imin altında istenmeyen yerim var
Marty Miller

41

Acını hissediyorum. Benim setIncludeFontPaddingiçin hiçbir şey yapmayan, yanlış olanı da dahil olmak üzere yukarıdaki her cevabı denedim .

Çözümüm? layout_marginBottom="-3dp"üzerinde TextViewsize alt, BAM için bir çözüm sunar!

Rağmen -3dp layout_marginTopbaşarısız .... ugh.


6
Bu, metnin alt kısmının potansiyel olarak kesilmesine yol açabilir
Jason Robinson

2
Negatif marj kullanımı gerçekten kötü bir fikir. Özel bir görünüm düşünmek ve metni tam istediğiniz gibi çizmek daha iyidir.
Flynn81

Böyle bir yama varsa, yazı tipi boyutunun oranını da hesaplamanız gerekir.
phnghue

37

Doğru cevap için çok şey aradım TextView, ancak tüm dolguları tam olarak kaldırabilecek bir Yanıt bulamadım , ancak son olarak resmi dokümana girdikten sonra Tek Satır Metinleri için bir çalışma var

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

Bu iki satırı TextViewxml'ye eklemek işi yapar.
İlk özellik aksanlar için ayrılan dolguyu kaldırır ve ikinci özellik iki metin satırı arasında uygun boşluğu korumak için ayrılan boşluğu kaldırır.

lineSpacingExtra="0dp"Görünümü beceriksiz hale getirebileceğinden çok satırlı TextView eklemediğinizden emin olun


11
Bu iki satırı eklemek benim için çalışmıyor ve ayrıca
dolguda bir

@ sunilkushwah, düzgün bir şekilde yapıyorsanız kesinlikle işe yarayacaktır. Sorununuz hakkında daha fazla bilgi verebilirseniz yardımcı olmaktan memnuniyet duyarız.
Muhammed Atıf

@sunilkushwah Muhtemelen github üzerine itebilir ve bağlantıyı paylaşabilirsiniz
Mohammed Atif

@sunilkushwah Brandon Font (Custom Font) kullandığınızı görüyorum. Bir kez fontPathözelliği kaldırarak deneyebilir misiniz ?
Muhammed Atıf

bunu denedim ama çalışmıyor, Not: TextView herhangi bir varsayılan dolgu istemiyorum
sunil kushwah

14

Kullanıyorsanız AppCompatTextView(veyaAPI 28 ileriye) ilk satırında boşluğu kaldırmak için bu 2 niteliklerin kombinasyonunu kullanabilirsiniz:

XML

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

Kotlin

text.firstBaselineToTopHeight = 0
text.includeFontPadding = false

11

Bu da beni rahatsız etti ve bulduğum cevap aslında TextView değil, yazı tipinin kendisinde ek alan olmasıydı. Bir belge yayınlama geçmişinden, tipografik öğeler üzerinde Android ile sahip olduğunuz sınırlı miktarda kontrolden gelen oldukça rahatsız edici. Bu sorunla karşılaşmayabilecek özel bir yazı biçimi (yeniden dağıtım için lisanslanmış Bitstream Vera Sans gibi) kullanmanızı öneririm. Yine de olup olmadığından emin değilim.


beni işaret edecek ücretsiz yazı tipin var mı? Negatif marj atamadan üstte marj olmam gerekiyor! Teşekkür ederim!
tonoz

11

Bu özelliği (ConstraintLayout) kullanmayı deneyebilirsiniz:layout_constraintBaseline_toBaselineOf

Bunun gibi:

app: layout_constraintBaseline_toBaselineOf = "+ id / TextView'un"

resim açıklamasını buraya girin

resim açıklamasını buraya girin


10

Özel görünüm - NoPaddingTextView - boşluk kaldırmak.

https://github.com/SenhLinsh/NoPaddingTextView

resim açıklamasını buraya girin

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

Bu soru veya cevap mı?
Tushar

@Tushar Bu bir cevap.
Linsh

Tamam. Buraya kodla ilgili biraz açıklama ekleyebilir misiniz?
Tushar

@Tushar Elbette, ama biraz daha fazlası.
Linsh

3
Bu kod soruyu çözebilir, ancak bunun sorunun nasıl ve neden çözüldüğüne dair bir açıklama da dahil olmak üzere , yayınınızın kalitesini artırmaya (ve oyları almanıza) yardımcı olacaktır. Sadece şu anda soran kişi için değil, gelecekte okuyucular için soruyu cevapladığınızı unutmayın! Lütfen açıklama eklemek için cevabınızı düzenleyin ve hangi sınırlamaların ve varsayımların geçerli olduğunu belirtin.
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>

Fazladan bir ImageView ile TextView'i ImageView ile taban çizgisi olacak şekilde ayarlayabilir ve android:baselineAlignBottom ve ImageView'daki değeri true olarak , bu da ImageView taban çizgisini en alt seviyeye indirir. Diğer görünümler, kendisini TextView'in taban çizgisiyle aynı olan ImageView'in altını kullanarak hizalayabilir.

Ancak bu yalnızca dolgu tabanını üst kısmı değil sabitler.


benim durumum için mükemmel, yazı tipi dolgu kaldırmak daha iyi. +1
Bawa

3

Bu sorunun şu şekilde çözülebileceğini düşünüyorum:

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

Bunlar sonuçlar:

Resmi-1

Resmi-3

RightLowerText'teki özel karakterler satırı, leftText öğesinin ikinci satırından biraz daha yüksek görünse de, taban çizgileri hala aynı hizadadır.


includeFontPadding = "false" tam olarak ihtiyacım olan şeydi! Teşekkürler.
hman

3

Benim gereksinim mevcut textView get geçersiz kıldığından findViewById(getResources().getIdentifier("xxx", "id", "android"));, bu yüzden sadece onDraw()başka bir cevap deneyemiyorum .

Ama sadece sorunumu düzeltmek için doğru adımları anladım, işte Layout Inspector'dan nihai sonuç:

resim açıklamasını buraya girin

İstediğim sadece üst boşlukları kaldırmak olduğundan, alt boşlukları kaldırmak için başka bir yazı tipi seçmek zorunda değilim.

İşte düzeltmek için kritik kod:

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

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

myTextView.setIncludeFontPadding(false);

İlk anahtar, özel alanı "fonts / myCustomFont.otf" olarak ayarlanmıştır, ancak altta boşluk vardır, ancak üstte değil, bunu açık otf dosyası ile kolayca anlayabilir ve android Studio'daki herhangi bir yazı tipini tıklayabilirsiniz:

resim açıklamasını buraya girin

Gördüğünüz gibi, alttaki imlecin ekstra aralığı var, ancak üstte değil, bu yüzden sorunumu düzeltti.

İkinci anahtar, herhangi bir kodu atlayamamanızdır , aksi takdirde çalışmayabilir. Bu nedenle, bazı kişilerin bir yanıtın işe yaradığını ve bazılarının da işe yaramadığını yorumlamalarını bulabilirsiniz.

Bunlardan birini kaldırırsam ne olacağını gösterelim.

Olmadan setTypeface(mfont);:

resim açıklamasını buraya girin

Olmadan setPadding(0, 0, 0, 0);:

resim açıklamasını buraya girin

Olmadan setIncludeFontPadding(false);:

resim açıklamasını buraya girin

3 tanesi olmadan (yani orijinal):

resim açıklamasını buraya girin



3

Güncellenmiş XML

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

Merhaba, Stack Overflow'a hoş geldiniz! Bir soruyu cevapladığınızda, yazarın neyi yanlış yaptığı ve düzeltmek için ne yaptığınız gibi bir tür açıklama eklemelisiniz. Size söylüyorum çünkü cevabınız düşük kaliteli olarak işaretlenmiş ve şu anda inceleniyor. Sen olabilir düzenleme "Düzenle" düğmesini tıklayarak cevabınızı.
Federico Grandi

Aslında doğru yazı tipine sahipseniz android: fontFamily gerekli değildir. Temelde android: includeFontPadding gerekli olan tek şey ve iş parçacığından önceki cevaplarda bahsedildi.
Darek Deoniziak

@DarekDeoniziak Bazı yazı tiplerinde boşluklar var
SJJ

2

Basit yöntem çalıştı:

setSingleLine();
setIncludeFontPadding(false);

Eğer işe yaramadıysa, bunu bu kodun üstüne eklemeyi deneyin:

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

Çoklu satıra ihtiyacınız varsa, belki de dolgunun üst ve alt yüksekliğini geçici tek satır TextView (dolguyu kaldırmadan önce ve sonra) aracılığıyla hesaplamanız, ardından negatif dolgu veya yükseklik Y ile bazı Hayalet Düzeni azaltma sonucu uygulamanız gerekir. lol


0

Sol metin görünümünün alt kısmını, sağ 2. metin görünümünün alt kısmıyla hizalamayı deneyebilirsiniz.


Ama sonra üst sıra sıralanmayacaktı. Ve aslında boşluğu kaldırmak istediğim kadar sıralanmalarını umursamıyorum.
Bryan Field

0

Bildiğim kadarıyla bu çoğu widget için doğaldır ve "dolgu" miktarı telefon üreticileri arasında farklılık gösterir. Bu dolgu, görüntü kenarlığı ile 9 yama görüntü dosyasındaki görüntü arasında gerçekten beyaz bir boşluktur.

Örneğin Droid X'imde, spinner widget'ları düğmelerden daha fazla beyaz alan elde ediyor, bu da bir düğmeyle bir spinner satır içi olduğunda garip görünmesini sağlıyor, ancak eşimin telefonunda aynı uygulama aynı sorun yok ve harika görünüyor!

Sahip olacağım tek öneri, kendi 9 yama dosyanızı oluşturmak ve bunları uygulamanızda kullanmaktır.

Ahhh Android acıları.

Düzenlendi: Dolguya karşı beyaz boşluğu netleştirin.


0

Bu hile benim için çalıştı ( min-sdk> = 18 ).

Kullandım android:includeFontPadding="false"ve negatif kenar boşluğu gibi android:layout_marginTop="-11dp"ve TextViewiçine bir FrameLayout( veya herhangi bir ViewGroup ... )

resim açıklamasını buraya girin

ve son olarak örnek kodlar:

<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
Bu hile, farklı yazı tipi, boyutlar veya düzenler için çalışmayabilir.
Adil Soomro

-1

Bunu gör:

ImageView'ı EditText ile yatay olarak hizalayın

EditText'in arka plan görüntüsünde dolgu ekleyen saydam pikseller de var gibi görünüyor.

Çözüm, EditText'in varsayılan arka planını başka bir şeyle (veya hiçbir şeyle değiştirmektir, ancak bir EditText için arka plan muhtemelen kabul edilemez). Bu android ayarlamak: arka plan XML özniteliği.

android:background="@drawable/myEditBackground"


-5

Bunu ImageView xml'nizde kullanın

android: adjustViewBounds = "true"


Lütfen bunun hakkında bir açıklama ekleyin
Nico Haase

bunun anlaşılması gerektiğini düşündüm. Yalnızca xml'de kullanılabilir.
Anshul Rawat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.