縦にLinearLayout
があり、その中に2つのTextView
があります。前者には静的テキストプロパティ(テキストは変更されない)が含まれ、最後には回帰タイマーが含まれています。下の画像は両方のアイテムを示しています。
両方のテキストの上部と下部の両方にある空白を削除したいと思います。私はいくつかのアプローチを試しました...
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>
負のマージンを使用してみてください。それを正しくするために数字をいじるには少し時間がかかるかもしれませんが、私は以前にそれをやったことがあり、うまくいきました。
Android:layout_marginTop="-5dp"
テキストのベースラインを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)
を呼び出します。
デフォルトでは、 TextViewにはアクセント文字用のスペースを残すためのパディングが含まれています 。あなたはそれをオフにすることができます:
Android:includeFontPadding="false"
または
textView.setIncludeFontPadding(false)
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
負のマージンはトリックを行います
私の要件はfindViewById(getResources().getIdentifier("xxx", "id", "Android"));
からの既存のtextView getのオーバーライドであるため、他の答えのonDraw()
を単純に試すことはできません。
しかし、私は自分の問題を修正するための正しい手順を理解しているだけです。レイアウトインスペクターの最終結果は次のとおりです。
私が欲しかったのは上部のスペースを削除することだけなので、下部のスペースを削除するために他のフォントを選択する必要はありません。
これを修正するための重要なコードは次のとおりです。
_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 =スタジオ:
ご覧のように、下部のカーソルには余白がありますが、上部にはありません。そのため、問題が解決しました。
2番目のキーはです。単純にコードをスキップすることはできません。それ以外の場合は機能しません。これが、回答が機能しているとコメントしている人と、機能していないとコメントしている人がいる理由です。
それらの1つを削除するとどうなるかを説明します。
setTypeface(mfont);
なし:
setPadding(0, 0, 0, 0);
なし:
setIncludeFontPadding(false);
なし:
それらの3つなし(つまり、オリジナル):
負のマージンは、仕事をします。次の2つの方法で設定できます-
1)xmlによって-Android:Layout_marginTop="-10dp"
負のフィールド
2)by Java(Programmatically)-LayoutParamsのtopMargin
フィールドを負に設定します。
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
}
}