2012-05-26 16 views
20

私はそれにTextViewの2つの垂直LinearLayoutを持っています。前者には静的テキストプロパティ(テキストは変更されません)があり、最後には回帰タイマーが含まれています。下の画像は、両方の項目を示しています積み重ねられた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

あなたは試しましたか? – Akram

答えて

40

が負のマージンを使用してみてください。それを正しくするために数字で遊ぶのが少しかかるかもしれませんが、私は前にそれをやっていて、それはうまくいきました。

android:layout_marginTop="-5dp" 
+0

実際に私はこれを長い間使用していましたが問題はありませんでしたが、これが本当に良い解決策であるかどうかは疑問に思っていますが、 –

+0

@PozzoApps修正よりも回避策ですが、うまくやっているので、... – Radu

+0

4.3で動いています=) –

2

負のマージンは、トリックに

+0

ネガティブパディングはTextViewsでは機能しません。 –

+0

私は自分の答えを編集し、パディング部分を削除しました –

14

を行いますのTextViewの下に等しいテキストのベースラインを作成します。

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

負のマージンで作業します。 XMLで

1) - - あなたは2つの方法でそれを設定できるJava(プログラム)によって

2負android:Layout_marginTop="-10dp"フィールド)を設定する - ネガティブにLayoutParamsのtopMarginフィールドを設定します。

11

デフォルトでは、TextView includes some padding to leave space for accent charactersです。あなたがそれをオフにすることができます:

android:includeFontPadding="false" 

または

textView.setIncludeFontPadding(false) 
+1

それは私のために働く。しかし、まだいくつかのスペースがそこにascenderとdescrollerのテキストを削除する方法はありますか? –

0

あなたがのTextViewの高さを変更し、多分アンドロイドを変更する必要があります。重力は=「底」

高さは、テキストサイズとサイズの間にありますWrapContentを含むtextView。あなたはそれが助けfalseにをincludeFontPadding を設定した場合

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

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

あなたが見ることができるように、一番下にカーソルが余分なスペースを持っていますがない上に、それは私の問題を修正しそう。

2番目のキーはです。コードをスキップすることはできません。それ以外の場合は機能しない可能性があります。そういうわけで、ある人が答えが働いていると答えている人もいます。

私がそれらのうちの1つを削除するとどうなるか説明しましょう。

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

関連する問題