2012-05-26 28 views
20

我有一個垂直LinearLayout其中兩個TextView裏面。前者包含一個靜態文本屬性(文本永遠不會改變),最後一個包含一個倒退計時器。下圖顯示了這兩個項目:刪除堆疊的TextViews之間的空間

stacked textviews

我想消除兩種文本具有頂部和底部的空白。我已經嘗試了幾種方法...

android:includeFontPadding="false" 
android:lineSpacingMultiplier="1" 
android:lineSpacingExtra="0dp" 
android:paddingTop="0dp" 
android:paddingBottom="0dp" 
android:layout_marginTop="0dp" 
android:layout_marginBottom="0dp" 

...但他們都沒有刪除文本上方的空間。我怎樣才能使兩個文本彼此靠近而沒有任何額外的空間?

PS:我找到了this similar question,但沒有人回答。


全面佈局代碼:

<LinearLayout 
    android:id="@+id/boxTime" 
    android:orientation="vertical" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="20dp" > 

    <TextView 
     android:id="@+id/textRemainingTime2" 
     android:layout_width="wrap_content" 
     android:layout_heigh="wrap_content" 
     android:layout_gravity="center" 
     android:gravity="center_horizontal" 
     android:textSize="70sp" 
     android:includeFontPadding="false" 
     android:lineSpacingMultiplier="1" 
     android:lineSpacingExtra="0dp" 
     android:paddingTop="0dp" 
     android:paddingBottom="0dp" 
     android:layout_marginTop="0dp" 
     android:layout_marginBottom="0dp" 
     android:text="@string/title" /> 

    <TextView 
     android:id="@+id/textRemainingTime" 
     android:layout_width="wrap_content" 
     android:layout_heigh="wrap_content" 
     android:layout_gravity="center" 
     android:gravity="center_horizontal" 
     android:includeFontPadding="false" 
     android:lineSpacingMultiplier="1" 
     android:lineSpacingExtra="0dp" 
     android:paddingTop="0dp" 
     android:paddingBottom="0dp" 
     android:layout_marginTop="0dp" 
     android:layout_marginBottom="0dp" 
     android:textSize="107sp" 
     android:text="@string/timer" /> 

</LinearLayout> 
+0

做你試圖-ve填充? – Akram

回答

40

嘗試使用負利潤。這可能需要玩一些數字才能正確使用,但之前我已經完成了,並且運行良好。

android:layout_marginTop="-5dp" 
+0

其實我已經使用了很長時間,從來沒有遇到過問題,但我一直懷疑這是否是一個很好的解決方案,但我看不到更好的解決方案。 –

+0

@PozzoApps這是一個解決方法,而不是修復,但它確實很好地完成了這項工作,所以... – Radu

+0

仍然適用於4.3 =) –

2

負利潤率會做的伎倆文本等於TextView的底部

+0

Negative填充不適用於TextViews。 –

+0

我編輯了我的答案並刪除了填充部分 –

14

製作基線。

public class BaselineTextView extends TextView { 

    public BaselineTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     int yOffset = getHeight() - getBaseline(); 
     canvas.translate(0, yOffset); 
     super.onDraw(canvas); 
    } 

} 
+3

這對任何字體,字體大小,屏幕密度等都適用。爲什麼它不是公認的答案? –

+0

這真的是所有人最方便的答案。 – tasomaniac

+0

所有這些都會將填充移動到視圖頂部,因此它仍然存在,並且必須在任何設計工作中考慮。 –

0

負邊距將完成這項工作。

1)通過XML - - 您可以通過兩種方法來設置它在Java設置android:Layout_marginTop="-10dp"場負

2)(編程) - 的LayoutParams的topMargin字段設置爲負。

0

你應該改變的TextView的高度,也許改變的android:重力=「底」

高度是TEXTSIZE和大小之間帶Wrapcontent的textView。

public class MyTextViewBounder extends TextView { 
public MyTextViewBounder(Context context) { 
    super(context); 
} 

public MyTextViewBounder(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public MyTextViewBounder(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 

} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    //test kích thước thực tế với kích thước của Textview bao quanh text của nó như thế nào 
    int width, height; 
    Paint iPaint; 
    Rect iRect = new Rect(); 

    iPaint = new Paint(); 
    iPaint.setTextSize(13); 
    iPaint.setTextAlign(Paint.Align.CENTER); 

    //call below code outsite 
    //this.setText("Hung"); 
    //this.setTextSize(TypedValue.COMPLEX_UNIT_PX,13); 
    //this..setIncludeFontPadding(false); //height from 18px down to 15px 
    iPaint.getTextBounds("Hung",0,4,iRect); //width = 34px, height = 12px 

    width = this.getWidth(); //= 30px 
    height = this.getHeight(); //= 18px 

    width = this.getMeasuredWidth(); //=30px 
    height = this.getMeasuredHeight(); //= 18px 

    width = iRect.width(); //34px 
    height = iRect.height(); //12 px 

} 

}

1

如果設置includeFontPadding假它幫助。

android:includeFontPadding="false" 

但如果你知道你沒有任何伸因爲你設置

android:textAllCaps="true" 

,或者您知道有沒有字符具有伸,你可以做一個自定義的TextView並設置高度基線。

public class ExTextView extends TextView { 

    public ExTextView(Context context) { 
     this(context, null); 
    } 

    public ExTextView(Context context, @Nullable AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public ExTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    public ExTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     setHeight(getBaseline()); // <--- Shrink size to baseline 
     super.onDraw(canvas); 
    } 
} 

源代碼包含在我的UiComponents測試應用程序中。 https://github.com/landenlabs/UiComponents

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