web-dev-qa-db-ja.com

Android別のビューからのRelativeLayoutalignCenter

私にはRelativeLayoutがあり、2つの子があり、どちらもRelativeLayoutsでいくつかのボタンなどが含まれています。これらの子レイアウトは私のメインレイアウトの中央に配置されておらず、メインレイアウトにはこれら2つの側面から離れた他のいくつかのものが含まれています。最初のものを2番目のものの上に置きたいです。これは簡単です。2番目のものでAndroid:layout_below="@+id/firstLayout"を使用するだけです。しかし、私はまた、2番目のものを最初のものの中央に揃えたいと思います。つまり、2番目のレイアウトで最初のレイアウトの中心を見つけ、その中心が同じx位置になるように配置します。 alignLeft, alignRight, alignTop, and alignBaselineが表示されますが、中心がありません。これは、2番目のレイアウトをスクートするためのマージンをハードコーディングすることなく実行できますか?

これが私が最終的にしようとしているものの大まかな例です。青いバーが最初のレイアウトになり、赤いボックスが2番目のレイアウトになります。両方を"wrap_content"に等しいサイズの別のRelativeLayoutでラップしてから、2番目のサイズにcenterHorizontal="true"を使用できることを知っています。しかし、私は実際には両方をメインレイアウトの子として残したいと思います(別のレイアウトの子にする場合は、アプリの特定の部分の動作方法にいくつかの変更を加える必要があります。これは避けようとしています)。

Example of what I want

27
FoamyGuy

親レイアウトの幅を「wrap_content」に設定できる場合は、両方の子レイアウトを中央に配置できます

9
Maxim

場合によっては、alignLeftalignRightを目的のビューに設定してから、中央に配置する要素に重力を使用できます。

例えば:

Android:layout_below="@+id/firstLayout"
Android:layout_alignLeft="@+id/firstLayout"
Android:layout_aligntRight="@+id/firstLayout"
Android:gravity="center"

コンポーネントがTextView(または背景を必要としないビュー)でない場合は、上記のプロパティを使用してFrameLayoutでラップできます。

<MyView id="@+id/firstLayout" .. other props/>

<FrameLayout 
    ... other props
    Android:layout_below="@+id/firstLayout"
    Android:layout_alignLeft="@+id/firstLayout"
    Android:layout_aligntRight="@+id/firstLayout"
    Android:gravity="center" >

    <MyView id="@+id/myAlignedView" ..other props />

</FrameLayout>

このように、下のビューは上のビューと同じ幅のフレームになりますが、その中には幅の中央に配置されたビューがあります。

もちろん、これはどちらがより大きなビューであるかがわかっている場合にのみ機能します。そうでない場合は、ラランジェイロが答えたように、両方のコンテンツを中心重力のある別のレイアウトでラップします。

3
htafoya

私がうまくいった唯一の解決策は、両方のコンポーネントを大きい方のコンポーネントの寸法でFrameLayoutにラップし、プロパティを使用して2番目のコンポーネントをFrameLayoutの中央に設定することでした。

<FrameLayout
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content">

    <ImageView
        Android:id="@+id/red_component"
        Android:layout_width="100dp"
        Android:layout_height="100dp"/>

    <View
        Android:id="@+id/blue_component"
        Android:layout_width="30dp"
        Android:layout_height="30dp"
        Android:layout_gravity="center" />

</FrameLayout>
1
Laranjeiro

テキストの場合、私はこのf.eを垂直中心の配置に使用しています。

Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:gravity="center_vertical"
Android:layout_alignTop="@id/theBigOne"
Android:layout_alignBottom="@id/theBigOne"
Android:layout_toRightOf="@id/theBigOne"
0
htafoya