web-dev-qa-db-ja.com

積み重ねられたTextView間のスペースを削除する

縦にLinearLayoutがあり、その中に2つのTextViewがあります。前者には静的テキストプロパティ(テキストは変更されない)が含まれ、最後には回帰タイマーが含まれています。下の画像は両方のアイテムを示しています。

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: この同様の質問 を見つけましたが、誰も答えませんでした。


完全なレイアウトコード:

<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>
28
borges

負のマージンを使用してみてください。それを正しくするために数字をいじるには少し時間がかかるかもしれませんが、私は以前にそれをやったことがあり、うまくいきました。

Android:layout_marginTop="-5dp"
44
Barak

テキストのベースラインを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);
    }

}

注:子孫が途切れるのを避けるには、TextViewの親ViewGroup(XMLではAndroid:clipChildren="false")でsetClipChildren(false)を呼び出します。

16
Zsolt Safrany

デフォルトでは、 TextViewにはアクセント文字用のスペースを残すためのパディングが含まれています 。あなたはそれをオフにすることができます:

 Android:includeFontPadding="false"

または

 textView.setIncludeFontPadding(false)
12
Kalle

includeFontPaddingをfalseに設定すると、役立ちます。

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

2
LanDenLabs

負のマージンはトリックを行います

2
Genia S.

私の要件はfindViewById(getResources().getIdentifier("xxx", "id", "Android"));からの既存のtextView getのオーバーライドであるため、他の答えの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);
_

最初のキーは、カスタムフォント "fonts/myCustomFont.otf"に設定されています。これは下部にスペースがあり、上部にはスペースがありません。otfファイルを開き、Android =スタジオ:

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

1
林果皞

負のマージンは、仕事をします。次の2つの方法で設定できます-

1)xmlによって-Android:Layout_marginTop="-10dp"負のフィールド

2)by Java(Programmatically)-LayoutParamsのtopMarginフィールドを負に設定します。

0
vhd

textViewの高さを変更し、Android:gravity = "bottom"も変更する必要があります

高さは、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

}

}

0
HungNM2