it-swarm-ja.tech

テキストをTextViewの上部に揃える方法は?

テキストをTextViewの上部に揃える方法は?
同等のAndroid SwingsのAPI setInsets()?
つまり、テキストの先頭は、TextViewの(0,0)で始まる必要があります

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent" 
    Android:layout_height="fill_parent" 
    Android:orientation="vertical">

    <TextView 
        Android:id="@+id/text1" 
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content" 
        Android:text="TextView" 
        Android:textSize="42sp" 
        Android:paddingTop="0px" 
        Android:gravity="top">
    </TextView> 
</LinearLayout> 

上記のスニペットを使用しましたが、出力は期待どおりではありません
何か案は?

そのため、TextViewの上部のスペースは、アクセントなどの英語以外の文字に使用されるパディングです。このスペースを削除するには、XMLで_Android:includeFontPadding_属性をfalseに設定するか、関数setIncludeFontPadding(false)を使用してプログラムで行うことができます。

それでも不明な場合は、 TextViewのSDKドキュメント をご覧ください。

編集済みの回答
_Android:includeFontPadding_属性を設定しても目的のことが達成できない場合、他の解決策は、使用しているTextViewのonDraw(Canvas canvas)メソッドをオーバーライドすることです。 AndroidはすべてのTextViewに追加する追加の上部パディングを削除します。元の回答を書いた後、何らかの理由でTextViewにフォントパディングに加えて余分なパディングが含まれていることに気付きました。 aswellこの追加のパディングは、テキストをTextViewの上部に完全に揃えるため、以下のコードスニペットをご覧ください。

_public class TopAlignedTextView extends TextView {

    // Default constructor when inflating from XML file
    public TopAlignedTextView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    // Default constructor override
    public TopAlignedTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs);
        setIncludeFontPadding(false); //remove the font padding
        setGravity(getGravity() | Gravity.TOP); //make sure that the gravity is set to the top
    }

    /*This is where the magic happens*/
    @Override
    protected void onDraw(Canvas canvas){
        TextPaint textPaint = getPaint(); 
        textPaint.setColor(getCurrentTextColor());
        textPaint.drawableState = getDrawableState();
        canvas.save();

        //converts 5dip into pixels            
        int additionalPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getContext().getResources().getDisplayMetrics());

        //subtracts the additional padding from the top of the canvas that textview draws to in order to align it with the top.            
        canvas.translate(0, -additionalPadding);
        if(getLayout() != null)
            getLayout().draw(canvas);
        canvas.restore();
    }
} 
_
66
Kachi

実際のフォント自体には、上部と下部に余分な空白があります。

通常、私がすることは、ビューにマイナスのマージンを与えることです。問題は、デバイスに異なるフォントが付属していると、見た目が悪いことです。

Android:layout_marginTop="-5dp"
Android:layout_marginBottom="-5dp"

テキストサイズに基づいて調整する必要があります。テキストサイズが大きくなると、より多くのネガティブパディングが必要になります。

18
Ryan

.xmlに次のように記述します。

Android:gravity="center|top"

最初の「中央」は線を中央で水平に揃え、次の「上」は垂直に上に揃えます。

16
Terranology

可能であれば、TextViewに基づいてビューを作成する必要はありません。ビューを拡張して、onDraw()にテキストを記述してください。

こちらをご覧ください: https://stackoverflow.com/a/32081250/1263771

2
tse

あなたのスニペットは正しいと思います。私はあなたが文字「T」の上部とTextViewの上部エッジの間のいくつかのピクセルに悩まされていると思いますか?このスペースは、英語のアルファベットにはない文字を表示するために必要です。

アイデアを得るためにそのリンクを確認してください:

1
alex2k8

私はあなたが何を意味しているのか理解しているかどうかはわかりませんが、text-viewでgravity = topを使用すると、textview内のテキストは上に揃えられます。

テキストビューに背景色を付けると、何が起こっているかをよりよく見ることができます...

問題は、親のLinearLayoutの高さと幅の両方でfill_parentを使用しているため、textviewが中央に配置されていることだと思います。 textviewは唯一の子であるように見えるので、LinearLayoutにgravity = topを配置してみてください...

それは私が考えることができる唯一のものです...

0
Vidar Vestnes