6

したがって、独自のビューを作成し、それにいくつかのTextViewを追加するセットアップがあります。ただし、重力設定は壊れています。(水平方向に中央に配置されますが、垂直方向には中央に配置されません)TextViewsだけでなく、ビュー内にも描画しているものがあるため、このようにしていますが、これらは正常に機能します。TextViewの重力にのみ問題があります。これが私が持っているものの部分的なコードです。

public class myView extends View {

    protected RelativeLayout baseLayout;
    protected TextView textView1;
    protected TextView textView2;

    public myView (Context context) {
        super(context);
        setLayoutParams(new LayoutParams(FILL_PARENT, FILL_PARENT));

        baseLayout = new RelativeLayout(context);
        baseLayout.setLayoutParams(new LayoutParams(FILL_PARENT, FILL_PARENT));

        textView1 = new TextView(context);
        // initialize textView1 string, id, textsize, and color here
        textView2 = new TextView(context);
        // initialize textView2 string, id, textsize, and color here

        baseLayout.addView(textView1);
        baseLayout.addView(textView2);
    }

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

        Resources res = getResources();
        // calculate out size and position of both textViews here
        textView1.layout(left1, top1, left1 + width1, top1 + height1);
        textView1.setGravity(Gravity.CENTER);
            textView1.setBackgroundColor(green); // just to make sure it's drawn in the right spot
        textView2.layout(left2, top2, left2 + width2, top2 + height2);
        textView2.setGravity(Gravity.CENTER);
            textView2.setBackgroundColor(blue); // same as above

        baseLayout.draw(canvas);
    }
}

これにより、TextViewが必要な正確なスポットとサイズで描画されます(背景色のためにわかります)が、重力により、垂直方向ではなく水平方向にのみ中央に配置されます。(はい、TextViewsは実際のテキスト文字列よりも大きくなります)

ここにあるソリューション(TextView重力)をおそらく実装できますが、これを回避するための非常に効率的または信頼性の高い方法とは思えません。重力が正しく機能しなくなる原因となっている、私が間違っていることはありますか?任意の入力/ヘルプをいただければ幸いです。

4

3 に答える 3

9

わかりました..それで私はこれを理解しました。各TextViewでmeasure()メソッドを実行する必要がありました。したがって、新しいコードは次のようになります。

    textView1.measure(MeasureSpec.makeMeasureSpec(width1, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height1, MeasureSpec.EXACTLY));
    textView1.layout(left1, top1, left1 + width1, top1 + height1);
    textView1.setGravity(Gravity.CENTER);

    textView2.measure(MeasureSpec.makeMeasureSpec(width2, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height2, MeasureSpec.EXACTLY));
    textView2.layout(left2, top2, left2 + width2, top2 + height2);
    textView2.setGravity(Gravity.CENTER);

これで、水平方向と垂直方向の両方が本来のように中央に配置されます。同じ問題が発生している場合は、これを試してください。

于 2011-06-03T23:44:50.320 に答える
2

このようにsetGravityを使用して、複数のGravityパラメータを設定できます。

textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL );

AndroidのTextViewでテキストを水平方向と垂直方向の中央に配置するにはどうすればよいですか?

于 2011-06-03T05:20:58.580 に答える
0

私もこの問題に遭遇しました。私の問題は、TextView.setGravity() を呼び出して TextView に重力を設定すると、親ビューでそれ自体 (Textview) のレイアウトに静かに影響することでした。

回避策の修正のために私がしたことは次のとおりです。

TextView schedule = getBubbleTextView (item, hasZeroSpanEvent);
// There's a bug in TextView, we need to use wrapper to fix it   
LinearLayout wrapper = new LinearLayout (getApplicationContext ());
wrapper.addView (schedule); 
hourlyBubbleParent.addView (wrapper, llp);

これを回避するにはラッパーを使用する必要があるという考えをつかむ必要があります。

于 2013-05-27T11:03:59.530 に答える