1

PercentRelativeLayout を使用して 4 つの ImageView を配置するウィジェットがあります。ボックスの 4 つの側面に沿って画像を配置するため、パーセント機能が必要ですが、相対的なサイズは異なります。上の子は高さの 60% を占めます。このレイアウトを単独でプレビューしましたが、うまく機能します。問題ありません。このウィジェットはwrap_contentw と h に対応しています (w はあまり気にしませんが、後でわかるように h は重要です)。

大きなレイアウト内でこのウィジェットが必要です。これで、別の親 RelativeLayout ができました。このレイアウトには、説明したウィジェットを上部に配置し、その下にいくつかのボタンをほぼ直線的に配置する必要があります|--(group widget)--(text button)--(image button)—-|。は、親にぴったり合う必要があることを示します。(これが Relative である理由は、右下に別のビューをフロートさせたいからです。)

したがって、目標は次のとおりです。この親レイアウトのサイズを事前定義されたサイズにする必要があります(基本的には画面ですが、私の完全なコードではこのレベルよりも上にありますが、このレベルで分離するだけで問題が発生します)、2つのボタンは計算する必要がありますそれらの自然なサイズとそれを使用する場合、上部の PercentRelativeLayout は「残りの」高さを取得し、それを子の % サイズ変更に使用する必要があります。

実際には、(レイアウト プレビュー ツールからの) スクリーンショットが示すように、PercentRelativeLayout はすべてのサイズを吸い上げます。

要するに、相対レイアウトで一連のビューを固定して、変数の子を持つことができますか? iOS では、最初のビューを親の上に固定し、最後のビューを親の下に固定し、すべてをその上のものに固定します。ボタンには固有のサイズがあり、謎のウィジェットが残りを吸い上げます。

<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#f2dce8ff"
android:layout_marginTop="8dp"
xmlns:android="http://schemas.android.com/apk/res/android">

<android.support.percent.PercentRelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    xmlns:tools="http://schemas.android.com/tools"
    android:animateLayoutChanges="true"
    android:id="@+id/matchPlay">

    <ImageView
        android:src="@drawable/model_2"
        tools:background="#954f47"
        app:layout_heightPercent="59%"
        app:layout_aspectRatio="100%"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:adjustViewBounds="false"
        android:id="@+id/avatarView1"
        android:scaleType="centerInside" />
    <ImageView
        android:src="@drawable/model_2"
        tools:background="#ff0000"
        app:layout_heightPercent="20%"
        app:layout_aspectRatio="100%"
        app:layout_marginTopPercent="2%"
        android:layout_below="@id/avatarView1"
        android:layout_alignParentLeft="true"
        android:adjustViewBounds="false"
        android:id="@+id/avatarView2"
        android:scaleType="centerCrop" />
    <ImageView
        android:src="@drawable/model_2"
        tools:background="#00ff00"
        app:layout_heightPercent="20%"
        app:layout_aspectRatio="100%"
        app:layout_marginTopPercent="2%"
        android:layout_below="@id/avatarView1"
        android:layout_alignParentRight="true"
        android:adjustViewBounds="false"
        android:id="@+id/avatarView3"
        android:scaleType="centerCrop" />
    <ImageView
        android:src="@drawable/model_2"
        tools:background="#0000ff"
        app:layout_heightPercent="22%"
        app:layout_aspectRatio="100%"
        android:layout_below="@id/avatarView2"
        android:layout_centerHorizontal="true"
        android:adjustViewBounds="false"
        android:id="@+id/avatarView4"
        android:scaleType="centerCrop" />

</android.support.percent.PercentRelativeLayout>

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/matchplay_add_shout"
    android:id="@+id/shoutButton"
    android:enabled="false"
    android:layout_centerHorizontal="true"
    android:layout_below="@id/matchPlay" />

<ImageButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/submitButton"
    android:src="@drawable/matchplay_submit"
    android:layout_centerHorizontal="true"
    android:layout_below="@id/shoutButton"
    android:minWidth="50dp"
    android:contentDescription="@string/matchplay_send_contentdesc" />

<ImageButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/passButton"
    android:src="@drawable/matchplay_pass"
    android:layout_alignParentEnd="true"
    android:layout_alignParentBottom="true"
    android:contentDescription="@string/matchplay_pass_contentdesc" />

編集: alignParentBottom を使用しないようにこのコードを更新しました。これが重要な問題であると考えていました。代わりに alignParentTop を使用しました。変化なし。また、ルートで垂直 LinearLayout を使用してみました。:(

ここに画像の説明を入力 ちなみに、画像グループ ウィジェットは PercentRelativeLayout サブクラスになるので、そこでオーバーライドを使って魔法を起こす必要がある場合は、それを行うことができます。

4

1 に答える 1

0

RelativeLayout ビーストについていくつかのことを学びました。

  • 子供のサイズと場所は密接に関係しているようです。場所とは別にサイズを計算する試みはありません。
  • RelativeLayout は、測定のための 2 回目のパスを実行していないようです。それは非常に貪欲です: それをどこに置くかを決定するために特定の子供に到達すると、その場で決定を下します. いくつかの状況があるかもしれませんが、よくわかりませんが、おそらく一般的ではありません。
  • 最後に、すべてを結び付けるものです。RL は幅と高さの依存関係の順序を計算するため、関係を指定する方法が重要です。依存されているものは最初にサイズが決定され、上から貪欲なプロパティを使用するため、その子のサイズが固定されていない場合、RL が提供する残りのスペースを使い果たします。したがって、上にあるものに依存するように配置しmatchPlay、ルートであるため、matchPlay最初にサイズを決定しました。

したがって、依存関係を後方に作成しただけで、物事が一番下に固定されたためmatchPlay、依存関係チェーンの最後になりました。奇妙だが機能する XML を以下に示します。実装の非常に奇妙な側面であり、さらにドキュメントには、相対的な layout_attrs にこの結合性の欠如が記載されていません。(明らかに、相対属性の使用方法に大きく影響する可能性があるため、そうすべきです!)

<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#f2dce8ff"
android:layout_marginTop="8dp"
xmlns:android="http://schemas.android.com/apk/res/android">

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/matchplay_add_shout"
    android:id="@+id/shoutButton"
    android:layout_above="@+id/submitButton"
    android:layout_marginTop="15dp"
    android:layout_centerHorizontal="true"
    android:enabled="false" />

<ImageButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:id="@+id/submitButton"
    android:src="@drawable/matchplay_submit"
    android:minWidth="50dp"
    android:contentDescription="@string/matchplay_send_contentdesc" />

<android.support.percent.PercentRelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@id/shoutButton"
    xmlns:tools="http://schemas.android.com/tools"
    android:animateLayoutChanges="true"
    android:id="@+id/matchPlay">

    <ImageView
        android:src="@drawable/model_2"
        tools:background="#954f47"
        app:layout_heightPercent="60%"
        app:layout_aspectRatio="100%"
        app:layout_marginBottomPercent="2%"
        android:layout_centerHorizontal="true"
        android:adjustViewBounds="false"
        android:id="@+id/avatarView1"
        android:scaleType="centerInside" />
    <ImageView
        android:src="@drawable/model_2"
        tools:background="#ff0000"
        app:layout_heightPercent="23%"
        app:layout_aspectRatio="100%"
        android:layout_below="@id/avatarView1"
        android:adjustViewBounds="false"
        android:id="@+id/avatarView2"
        android:scaleType="centerCrop" />
    <ImageView
        android:src="@drawable/model_2"
        tools:background="#00ff00"
        app:layout_heightPercent="23%"
        app:layout_aspectRatio="100%"
        android:layout_below="@id/avatarView1"
        android:layout_alignParentRight="true"
        android:adjustViewBounds="false"
        android:id="@+id/avatarView3"
        android:scaleType="centerCrop" />
    <ImageView
        android:src="@drawable/model_2"
        tools:background="#0000ff"
        app:layout_heightPercent="23%"
        app:layout_aspectRatio="100%"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:adjustViewBounds="false"
        android:id="@+id/avatarView4"
        android:scaleType="centerCrop" />

</android.support.percent.PercentRelativeLayout>

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/passButton"
        android:src="@drawable/matchplay_pass"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:contentDescription="@string/matchplay_pass_contentdesc" />

于 2016-09-14T01:10:46.400 に答える