2011-01-22 162 views
114

刪除間距和填補當我有與在文本中\n一個TextView ,,在右邊我有兩個singleLineTextView S,一個在另一個之下,在之間不存在間距。我爲所有三個TextView s設置了以下內容。機器人:TextView的:頂部和底部

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

TextView線的第一行了完美地與右上方TextView。左側TextView的第二行比右下角TextView的第二行稍高。

看起來在TextView s的頂部和底部有某種隱藏填充。我該如何刪除它?

+0

嘗試設置這樣的TextView到center_vertical – 2013-11-06 11:55:49

+0

嗨,喬治·貝利的重心,你有這麼長的時間後的解決方案?我現在也遇到這個問題。你能給我你的解決方案嗎?謝謝。 – mmm2006 2014-12-30 06:33:31

+1

@ mmm2006,這麼長時間我不知道我最終做了什麼。在答案中嘗試解決方案。如果這不起作用,請提出一個新問題。 – 2015-01-09 16:48:40

回答

0

您可能想嘗試將左側文本視圖的底部與第二個右側文本視圖的底部對齊。

+0

但是,然後頂線不會排隊。實際上,我並不在乎他們排隊的次數,因爲我真的很想去除間距。 – 2011-01-22 15:50:31

0

據我所知,這是大多數小部件固有的,「填充」的數量在電話製造商中是不同的。該填充實際上是圖像邊界與9補丁映像文件中的圖像之間的空白區域。

例如在我的Droid X上,微調控件的widget會比按鈕獲得額外的空白空間,這使得當你的微調框內嵌一個按鈕時,看起來很尷尬,但是在我妻子的手機上,同樣的應用程序沒有同樣的問題看起來很棒!

我唯一的建議是創建自己的9個補丁文件,並在您的應用程序中使用它們。

Ahhh是Android的痛苦。

編輯:澄清填充VS空白。

5

這也讓我很生氣,我發現的答案是字體本身實際上還有額外的空間,而不是TextView。這是來自文檔發佈背景的相當讓人惱火的一點,就是Android對印刷元素的控制有限。我建議使用自定義字體(比如Bitstream Vera Sans,這是允許重新分發的),可能沒有這個問題。不過,我不確定具體是否。

+0

你有一些免費的字體指向我嗎?如果沒有分配負邊距,我需要無邊距!謝謝! – vault 2013-01-23 09:51:51

342
setIncludeFontPadding (boolean includepad) 

XML這將是:

android:includeFontPadding="false" 

設置TextView是否包括額外的頂部和底部填充,以騰出空間是走正常的上升和下降以上的口音。默認值是true。

+73

完美答案!!!在xml它是android:includeFontPadding =「false」 – 2011-08-09 10:44:30

+2

但它似乎總是有一個'1dp`頂部/底部填充,我錯了嗎?(我使用`開發人員選項 - >顯示佈局範圍') – Autobots 2014-07-01 11:34:23

32

我感到你的痛苦。我已經嘗試了上面的每個答案,包括setIncludeFontPadding爲假,這對我沒有任何幫助。

我的解決方案? layout_marginBottom="-3dp"TextView爲您提供底部解決方案, BAM!

儘管layout_marginTop上的-3dp失敗....呃。

0

看到這個:

Align ImageView with EditText horizontally

看來,EditText上的背景圖片有一些透明的像素也添加填充。

一個解決辦法是改變的EditText的默認背景別的東西(或什麼,但沒有背景的EditText上可能是不接受的)。這可以設置android:background XML屬性。

android:background="@drawable/myEditBackground" 
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我們可以設置爲基線與ImageView的對齊的TextView並設置android:baselineAlignBottom上的ImageView爲真,這將使得ImageView的基線上下。其他視圖可以使用ImageView的底部自行對齊,它本身與TextView的基線相同。

但是,這僅修復了填充底部不頂。

12

我搜索了很多正確的答案,但沒有在那裏我能找到答案,這可能正是從TextView刪除所有的填充物,但最後通過official doc會後得到了單行文本週圍的工作

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

添加上述兩行TextView XML將做的工作。
第一個屬性刪除爲重音保留的填充,第二個屬性刪除保留的間距以在兩行文本之間保持適當的空間。

確保不要在多TextView中添加lineSpacingExtra="0dp",因爲它可能使外觀笨拙

3

我刪除的間距在我的自定義視圖 - NoPaddingTextView。

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

我覺得這個問題可以這樣解決:

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

這些都是結果:

ScreenShot-1

ScreenShot-3

雖然特殊字符在rightLowerText行看起來比leftText的第二線高那麼一點點,他們的基線對齊平息。

0

由於我的要求是覆蓋現有的textView從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); 

的第一個關鍵是設置自定義字體「字體/ 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