19

こんにちは。相対的なレイアウトに少し問題があり、その理由がわかりません。通常、他のビューに対して相対的に配置しようとするときは、「@id」を使用しますが、まったく配置されていないようです。値「@ + id」を使用した場合にのみ、正しく機能します。以下の例では、水平方向に 4 つのビューがあります。「percentage_id」を持つ TextView をイメージビューの間に配置しますが、最後のビューに近づけます。

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/sales_id"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="10dp"
        android:text="£0.00"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="#AADDEE"
        android:textSize="18sp"
        android:textStyle="bold" >
    </TextView>

    <ImageView
        android:id="@+id/arrow_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_toRightOf="@id/sales_id"
        android:baselineAlignBottom="true"
        android:src="@drawable/rightarrow" >
    </ImageView>

    <TextView
        android:id="@+id/percentage_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@id/imagearrow_id"
        android:layout_toRightOf="@id/arrow_id"
        android:text="0.00%"
        android:textColor="#606090"
        android:textSize="18sp" >
    </TextView>

    <ImageView
        android:id="@+id/imagearrow_id"
        android:layout_width="20dp"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginLeft="2dp"
        android:layout_weight="0"
        android:gravity="right"
        android:padding="5dp"
        android:src="@drawable/rightarrow" >
    </ImageView>

</RelativeLayout>

何をしても、相対レイアウトのデフォルト位置に移動するだけで、「@id」の代わりに「@+id」を使用した場合にのみ、正しい位置に移動します。参照しようとしているビューがまだ宣言されていない場合、エラーが発生することがありますが、テキストビューを最後に配置しても、「@ + id」を使用するまで、必要な場所に取得できません。

これは、相対レイアウトでも機能する新しいものですか? 「@id」で機能しない理由がわからないためです。私はこのままでいいですか?誰も同じ問題に遭遇しましたか?ポジショニングにも「@+id」を使用するネット上のいくつかのチュートリアルを参照してください。ありがとうございました

4

3 に答える 3

31

階層の後半で宣言されたビューを参照することはできますが、XML ドキュメントは引き続き順次解析されます。特定の ID を初めて参照するとき、接頭辞 を付ける必要があり@+idます。実際には、ID へのすべての参照にプレフィックスを付けることができ@+id、すべてが機能します。実際、これは、グラフィカル エディターでインターフェイスを設計する場合に起こることです。安全のために、すべてに接頭辞が付いてい@+idます。は、IDがまだ定義されていない場合にのみ+ID を生成するように指示するだけです。R.java複数回定義しようとすると、既に定義されていると見なされ、通常どおり続行されます。

XML では、 TextViewから参照imagearrow_idします。percentage_idただし、この時点でimagearrow_idは はまだ定義されていません。このシナリオではlayout_toLeftOf=@+id/imagearrow_id、TextView でプレフィックスを付けるだけで済みます。次に、ImageView ( imagearrow_id) を定義するときに、属性で を使用する必要はありません。+android:id

于 2012-10-09T17:31:48.400 に答える
3

@+id初めてIDを宣言するときに使用され、要素の配置には使用しないでください。android:id属性にのみ使用する必要があります。

@id一方、既存の ID を参照するために使用されます。

ではRelativeLayout、現在のコードで参照ビューの下にあるビューを参照することはできません。したがって、次のレイアウトがある場合:

LayoutRoot
    View1
    View2
    View3

View1 は、View2 と View3 を使用してその位置を定義することはできません。View2 は View1 のみを使用してその位置を定義する必要があり、View3 は View1 と View2 の両方を使用できます。

基本的に、@idそれを介して参照しているビューが、レイアウト ファイル内の参照ビューの上で宣言されている場合はいつでも使用できます。

したがって、最後の 2 つのウィジェットのコード ブロックの位置を切り替えるだけで、以下を使用できるようになります@id

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/sales_id"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="10dp"
        android:text="£0.00"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="#AADDEE"
        android:textSize="18sp"
        android:textStyle="bold" >
    </TextView>

    <ImageView
        android:id="@+id/arrow_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_toRightOf="@id/sales_id"
        android:baselineAlignBottom="true"
        android:src="@drawable/rightarrow" >
    </ImageView>

    <ImageView
        android:id="@+id/imagearrow_id"
        android:layout_width="20dp"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginLeft="2dp"
        android:layout_weight="0"
        android:gravity="right"
        android:padding="5dp"
        android:src="@drawable/rightarrow" >
    </ImageView>

    <TextView
        android:id="@+id/percentage_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@id/imagearrow_id"
        android:layout_toRightOf="@id/arrow_id"
        android:text="0.00%"
        android:textColor="#606090"
        android:textSize="18sp" >
    </TextView>

</RelativeLayout>
于 2012-10-09T17:25:24.940 に答える