19

RelativeLayoutビューをレイアウトの側面 (任意の側面) に揃えて、同じ方向に大きなマージンを設定すると、奇妙な動作に気付きました。

RelativeLayoutsそれぞれに単純なビューが含まれている2つがあります。1 つのレイアウトではビューが上下左右に配置され、もう 1 つのレイアウトでは上下左右に配置されます。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <RelativeLayout 
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_marginTop="110dp"
        android:layout_gravity="center"
        android:background="#ff555555" >

        <View
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_alignParentTop="true"
            android:layout_alignParentLeft="true"
            android:background="#aa8711" />     
    </RelativeLayout>

    <RelativeLayout 
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_marginBottom="110dp"
        android:layout_gravity="center"
        android:background="#ff555555" >

        <View
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:background="#998877" />         
     </RelativeLayout>      
</FrameLayout>

次のようになります。

基本設定

親の配置の各方向に 130 dp の余白を追加しました。つまり、ビューはレイアウトで部分的にのみ表示される必要があります。これが起こることです:

アライメントの各方向に 130 dp

ご覧のとおり、ビューがレイアウトの「壁」に押し付けられるため、ビューが元のサイズよりも小さくなっています。次に、レイアウトよりも大きな余白を与えようとしたので、整列方向に 151 dp の余白を与えました。次のように見えました。

ここに画像の説明を入力

右下に配置されたビューがレイアウトから「分割」され、元のサイズと同じになります。一方、左上に配置されたビューは元のサイズのままですが、レイアウトの外側ではなく、レイアウトの内側に完全に収まっています。

私はこれを個別に、および配置のすべての順列で試しましたが、同じ結果が得られました。

質問 1:この一貫性のない動作を説明できる人はいますか?

同じことを試してみましたが、今回は動作を の動作と比較しFrameLayoutます。初期設定:

ここに画像の説明を入力

および余白の後:

ここに画像の説明を入力

FrameLayoutはビューを常に元のサイズに保ち、単にビューを「終了」させます。少なくとも の外側にある必要があるビューのサイズの反対方向に負のマージンを与えようとしましたが、デフォルトRelativeLayoutで で発生するのと同じ動作が見られました。FrameLayout

質問 2:動作の違いと、逆のマイナスのマージン効果を説明できる人はいますか?

4

1 に答える 1

3

部分的にしか見えないのはなぜですか?

親の配置の各方向に 130 dp の余白を追加しました。つまり、ビューはレイアウトで部分的にしか見えないようにする必要があります

マージンを適用しながら、親レイアウト内に保持することが優先されるため、ボックスは小さくなっています。小さい方の子ビューは 50 dp であるため、マージンを追加しました。130dp必要な合計幅は です180dpが、親ビュー自体は150dp幅しかありません。つまり130dp + 50dp > 150dp、子とマージンを合わせたものが親の中に収まりません。

これは「ばかげた入力」であり、XML インタープリターは何かをレンダリングするために最善を尽くしています。最終的に下す決定は、子ボックスの幅を変更しても余白の制約を尊重できるということです。または数学的に

130dp + 20dp == 150dp

50dp基本的に、内側のボックスの幅を割り当てられたから縮小して20dp、追加されたマージンで親の内側に収まるようにします。正方形のサイズを見ると、20dpほぼ正しいように見えます。60% 小さいです。

画面サイズが変更され、このような問題が発生すると、幅の制約ではなくマージンの制約を常に保持する必要があるため、これはインタープリターによる賢い動作です。

要約すると、インタプリタはボックスとその親の内側のマージンに合わせるために最善を尽くしており、そうするためにボックスを小さくしています。指定された幅で、指定されたマージンを維持することを選択しています - おそらく最上位の親レイアウトのためです。

「これは部分的に見えるはずです」と言うとき、Windowsフォーム開発と同様に、子は親境界の半分と親境界の外側の半分をレンダリングすると思います。ただし、ほとんどのレイアウトでは常に子を親の境界内に保持しようとするため、これは当てはまりません。

行われる選択は、最上位の親レイアウトにも依存します。一部のレイアウトでは、マージンよりも子ボックスの幅を維持したり、親の境界の外にボックスをレンダリングしたりすることさえあります。


2 番目のケースでは:

そのため、整列した方向に 151 dp のマージンを与えました。

インタープリターが画像を縮小できるポイントを超えています。画像をマイナス 1 に縮小することはできません。つまり、

50dp + 151dp > 150dp

与えられたこのマージン制約を満たすことができないため、動作はかなり予測できません。推測では、親の内側の余白とともに、両方の画像を保持できないことを知っていると思います。そのため、1 つを内側に、もう 1 つを外側にレンダリングするだけです。

繰り返しますが、これはばかげた入力であり、インタープリターはユーザーが望むものをレンダリングするために最善を尽くしています。


行動の違いと反対のマイナスのマージン効果を説明できる人はいますか?

負のマージンは、その親のレイアウトのタイプに応じて異なることを行い、それも配置されます。フレーム レイアウトでは、相対レイアウトとは異なる動作をします。通常、ネガティブ レイアウトを見ている場合は、間違った親コンテナーを選択しており、それをハッキングして正しく表示しようとしています。

あなたが何をしようとしているのか正確にはわかりませんが、思考プロセスを少し微調整して、与えられた XML を理解しようとする貧弱な解釈を考える必要があるかもしれません。

Android の XML レイアウトに完全に混乱する人は、あなたが初めてではないでしょう。レイアウト内にレイアウトを入れ子にすることは常に混乱を招き、マージン、配置、幅などのさまざまな要素に応じて動作が変化します。私が知っているほとんどの人は、適切になるまでそれをいじくり回し、さまざまなコンテナー レイアウト タイプを試して適切なデザインを取得します。 .

要するに、余白 (flash や winform など) を使用するのを避け、代わりにレイアウト タイプを使用せずに使用して、必要な場所に配置します。

お役に立てば幸いです。tl;dr で申し訳ありません。

于 2013-12-23T06:45:14.127 に答える