Вопрос с «@id» и «@ + id» в позиционировании в Relative Layout

Добрый день, у меня небольшая проблема с относительными макетами, и я не знаю почему. Обычно, когда вы пытаетесь позиционировать по отношению к другим представлениям, вы используете «@id», но, похоже, он вообще не позиционируется. Только когда я использую значение «@ + id», это будет правильно. В приведенном ниже примере у меня есть 4 вида в горизонтальной ориентации. Я хочу, чтобы TextView с «percent_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> <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».

Это новая вещь, которая работает также с Relative Layout? Потому что я понятия не имею, почему он не работает с «@id». Я в порядке? Кто-нибудь столкнулся с той же проблемой? См. Некоторые руководства по сетевому использованию «@ + id» для позиционирования. спасибо

Solutions Collecting From Web of "Вопрос с «@id» и «@ + id» в позиционировании в Relative Layout"

Хотя вы можете ссылаться на представления, объявленные позже в иерархии, XML-документ по-прежнему анализируется последовательно. В первый раз, когда вы ссылаетесь на конкретный идентификатор, вы должны префикс его с помощью @+id . На самом деле вы можете префикс каждой ссылки на ID с @+id и все будет работать – на самом деле это происходит, если вы создаете свой интерфейс с графическим редактором. Чтобы быть в безопасности, все имеет префикс @+id . + Просто говорит ему генерировать идентификатор в R.java тогда и только тогда, когда он еще не определен. Если вы попытаетесь определить его более одного раза, он просто видит, что он уже определен и продолжается нормально.

В вашем XML вы ссылаетесь на imagearrow_id из вашего text_id. Однако на данный момент imagearrow_id еще не определен. Для этого сценария вы можете просто префикс layout_toLeftOf=@+id/imagearrow_id в вашем TextView, а затем ниже, при определении вашего ImageView ( imagearrow_id ) вам не понадобится + в атрибуте android:id .

@+id используется при объявлении идентификатора в первый раз, и вы не должны использовать его при позиционировании элементов. Он должен использоваться только для атрибута android:id .

@id с другой стороны, используется для ссылки на существующий идентификатор.

В RelativeLayout вы не можете ссылаться на представления ниже ссылочного вида в текущем коде. Поэтому, если у вас есть следующий макет:

 LayoutRoot View1 View2 View3 

View1 не может, или, скорее, не должен, использовать View2 и View3 для определения своей позиции. View2 должен использовать только View1 для определения своей позиции, а View3 может использовать как View1, так и View2.

По существу, вы можете использовать @id всякий раз, когда представление, с которым вы ссылаетесь через него, было объявлено выше ссылочного вида в файле макета.

Таким образом, просто переключение позиций кодовых блоков двух последних виджетов должно позволить вам использовать @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>