Подтвердить что ты не робот

Вопрос с "@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" для позиционирования. Спасибо вам

4b9b3361

Ответ 1

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

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

Ответ 2

@+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>