0

ADTとEclipseでのレイアウトのサポートに少し不満を感じています。もう一度スイングします。基本的に私は次のような単純なレイアウトを実装しようとしています:RelativeLayout

+----------------+
|                |
| FrameLayout    |
|    ImageView   |
|                |
|                |
|                |
+----------------+
| LinearLayout   |
|    TextView    |
|    Buttons     |
+----------------+

私が書いたパン/ズームリスナーのサポートのために、RelativeLayoutとFrameLayoutがImageViewで使用されます。

私が抱えている問題は、LinearLayout(下部のコントロール)が、何を試してもウィンドウの下部に表示されないことです。下にあるものを貼り付けるだけです。FieldViewはImageViewの拡張であることに注意してください。画像は正常に表示されます。邪魔になるFrameLayoutの上に表示したいLinearLayoutです。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fieldcontainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:baselineAligned="false"
    android:orientation="vertical" >

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <com.test.FieldView
            android:id="@+id/field"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </FrameLayout>

    <LinearLayout
        android:id="@+id/controls"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/buttonAddNode"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Add node" />

        <TextView
            android:id="@+id/textViewNodeInfo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TextView" />
    </LinearLayout>

</RelativeLayout>

アドバイスをよろしくお願いします。以前の試行でRelativeLayoutパラメーターを誤用した可能性があります。

更新 迅速な対応に感謝します!以下のコードでコメントすることができなかったので、これが私が試したアップデートです:

<FrameLayout
    ...
    android:layout_above="@+id/controls">

;以前は、実行時に次の例外が発生しました。

Unable to start activity ComponentInfo{com.test.MainActivity}:
    java.lang.ClassCastException: android.widget.LinearLayout

例外をスローする行は、私のMainActivity.OnCreate()にあります。

view = (FieldView) findViewById(R.id.field);

layout_belowを追加するとIDの不一致が発生したようです。R.id.fieldを見つけると、間違ったLinearLayoutのIDが返されますが、これは当然キャストできません。

layout_aboveがなければ、これは問題なく機能し、レイアウトが壊れているだけであることに注意してください。繰り返しますが、FieldViewはImageViewの単なる拡張です。タッチリスナーやその他のものをそこに保存します。

4

3 に答える 3

1

android:layout_alignParentBottom="true"レイアウトのにプロパティを追加しLinearLayoutます。FrameLayoutを下に入れないようにする場合LinearLayout、レイアウトは次のようになります。

<RelativeLayout>

    <LinearLayout  android:id="@+id/ll" android:layout_alignParentBottom="true" />
    <FrameLayout android:layout_above="@id/ll" android:layout_alignParentTop="true"/>
</RelativeLayout>
于 2012-11-25T20:25:05.360 に答える
1

すべてを相対レイアウトでラップし、を使用して線形レイアウトを下部に固定するだけです。android:layout_alignParentBottom="true"

コントロールがその上のものによってオーバーランされないようにするには、を使用してコントロールを上にレイアウトしますandroid:layout_above="@id/controls"

そのようです:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fieldcontainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:baselineAligned="false" >
    <!-- Your other stuff -->

    <LinearLayout
        android:id="@+id/controls"
        android:layout_width="match_parent"
        android:layout_height="wrap_contgnt"
        android:orientation="horizontal"
        android:layout_alignParentBottom="true">
    <!-- Your control stuff -->
    </linearlayout>
</relativelayout>

@+単に参照()する前に、id()を定義する必要があることに注意してください@。したがって、コントロールビューを移動してXMLファイルで他の何よりも先に発生させるか、最初に来る場所参照で「@ +」を使用してから、ビュー定義で@を使用することができます。

したがってandroid:layout_above="@+id/controls"、他の行はになりますandroid:id="@id/controls"

また、レイアウトを変更しても、レイアウトを変更しない限り、その中に存在するIDには影響しません。

于 2012-11-25T20:27:56.830 に答える
1

相対レイアウトを使用していますが、位置を制御するためにその属性を使用していません。

あなたがそれを持っているので、あなたは垂直のLinearLayoutを使用したほうがよいでしょう。また、FrameLayoutとLinearLayoutの高さをmatch_parentに設定しました。これは、これらのビューグループを親ビューであるRelativeLayoutにレイアウトするすべての責任を委譲したことを意味します。

Androidがレイアウトをレイアウトするとき、2つのトップダウンパスを実行します。まず、親は子供たちにどれだけ大きくなりたいかを尋ねます。これを行うために、それ自体のサイズを子供たちに渡します。したがって、FrameLayoutとLinearLayoutのそれぞれは、親と同じサイズになりたいと言います。RelativeLayoutには、これらのコントロールが相互にどのように関連するかを決定するルールがないため、内容を考慮して、各コントロールを可能な限り大きくしようとします。2番目のパスは、親が各子に自分自身を作成する大きさを指示し、レイアウトをレンダリングするときにトップダウンになります。

したがって、問題を解決するために、2つのアプローチのいずれかを使用します(他にもありますが、このような単純なレイアウトの場合は、それらは必要ありません)。

  • を使用してRelativeLayoutを使用するとlayout_below、サイズに関係なく、またはさまざまな親の配置属性のいずれかを使用して、LinearLayoutを常にFrameLayoutの下に配置します。

  • より正確な制御を行うには、レイアウトの重みを使用して、それぞれの子の位置と正確なサイズの両方にLinearLayoutを使用します。このアプローチを採用する場合は、高さを0dipに設定し、ビューの「支柱」を使用して配置することを忘れないでください。

私の個人的な好みは、LLを使用することです。これは、LLが堅固で、正確なレイアウトのサイズ設定と配置を簡単に取得できることがわかったためです(ただし、LLを拡張して、onMeasure()メソッドを混乱させる必要がある場合もありますが、これはAndroidの断片化の問題であり、直接関連)。

android:layout_weightはどういう意味ですか?

于 2012-11-25T20:31:24.033 に答える