2

私は、LinearLayoutを拡張するこの他のカスタムビュー内にあるこのカスタムビューを中央に配置しようとしています。これはすべて実行時に行われるため、コードを介して行う必要があります。

重力を設定して標準的なアプローチを試しました。

this.setGravity(Gravity.CENTER);

これは、LinearLayoutを拡張するクラス内で行われました。

LayoutParamsメソッドも試しました。

    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    params.gravity = Gravity.CENTER;
    block.setLayoutParams(params);
    this.addView(block);

これは、ビューにブロックを追加した場所で行われました(ご覧のとおり)。

どちらの方法でも、ブロックはビューの左上隅に配置されたままになりました。私の他の選択肢は何ですか、またはもっと重要なことに、私は世界で何を間違っているのですか?

4

2 に答える 2

5

レイアウトの重みも設定してみてください。

LinearLayout.LayoutParams params =
    new LinearLayout.LayoutParams(
        LayoutParams.FILL_PARENT,
        LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.CENTER_HORIZONTAL;
params.weight = 1;
this.addView(block, params);

これにより(向きが垂直であると仮定して)、ビューが線形レイアウトの残りのスペースを埋めることができ、水平方向の中央に配置する必要があります。

ビューの子を、それを含むLinearLayoutセルよりも小さいものにする方法はないと思います。ビューがその「セル」よりも小さい場合、LinearLayoutはそれを収容するために縮小します。レイアウトの重みによって「セル」が大きくなると、含まれているビューも大きくなります。

ビューを「セル」よりも小さく中央に配置したい場合は、FrameLayoutでラップします。そうすれば、心ゆくまで中心重力を利用できるようになります。layout_width = "fill_parent" xml内(これを直接使用できないことはわかっていますが、この方法で説明する方が簡単です):

<LinearLayout orientation="vertical">
    <FrameLayout layout_weight="1" layout_height="wrap_content">
        <View layout_gravity="center" layout_{width,height}="wrap_content"/>
    </FrameLayout>
        ... other views ...
</LinearLayout>

マークされていないレイアウト属性は「fill_parent」です。

于 2011-03-15T05:43:42.243 に答える
1

これを見てください:http://thinkandroid.wordpress.com/2010/01/14/how-to-position-views-properly-in-layouts/

基本的に、android:gravityはビュー内の位置に影響を与えますが、android:layout_gravityはビューをその親に対して相対的に配置します。したがって、ビュー全体を移動するには、レイアウト重力を使用する必要があります。

于 2011-03-15T05:41:58.970 に答える