Почему присутствие и отсутствие символа + перед id при разных случаях выдает не всегда логичные результаты?

Читал книгу и наткнулся на эту инфо. (Указана ниже на скрине, красным цветом)

введите сюда описание изображения

Ну вроде на первый взгляд все прозрачно: "При добавлении уникального id к нужному View надо использовать символ +, а при использовании уже созданного id, надо убрать символ +".

Но вот решил попрактиковаться и вот на что наткнулся:

1) Работает правильно (ну этот код из одних моих уже давно написанных приложении), хотя в книге написано, что надо убрать символ + (да и логично было бы).

введите сюда описание изображения

2) Убрал символ + из этих двух строк.

Результат: Вроде снова работает правильно (да и логичней, чем предыдущий вариант, исходя из выше утверждении в книге), в смысле Preview выдает одинаковый результат.

введите сюда описание изображения

Но вот решил пойти еще дальше: взял и закоментил один из View, к которому ссылается данный первый View (с помощью которого я веду эксперименты)

введите сюда описание изображения

И вот что вышло в итоге, когда повторил предыдущие 2 эксперимента для данного случая:

1) Если как и в предыдущем соответствующем варианте - оставить символ + на месте (в смысле не убрать его) то получится следующее:

введите сюда описание изображения

Странно так? Но еще страннее второй пункт

2) Если как и в предыдущем соответствующем варианте - убрать символ +, то получится кое что вообще удивительное:

введите сюда описание изображения

Не ошибки, не предупреждения??? Как так???

Ладно, я неугомонный, копаю еще дальше и натыкаюсь еще на кое что.

Так как в предыдущих экспериментах рассмотривалась модель tv1 (tv4, tv5), то теперь рассмотрю другую модель для получения более полноценной картины происходящего а именно, модель tv7 (tv4, tv5).

И так, итог:

1) tv4 закоментируем обратно, в смысле уберем режим коммента и снова выполним первый эксперимент, который недавно сделали для модели tv1 (tv4, tv5). Итог:

введите сюда описание изображения

Не предупреждении, не ошибок. Интуитивно понятно но не логично, если основываться на выше указанных утверждении из книги.

2) Если снять символ +, оставляя tv4 в активном режиме, то получится следующее:

введите сюда описание изображения

И снова не предупреждении, не ошибок. Интуитивно понятно но на этот раз вполне логично, если основываться на выше указанных утверждении из книги.

А теперь коронный номер.

Снова комментим tv4 и повторим эксперимент (тот же самый что и во время модели tv1 (tv4, tv5))

1) если оставить символ +, то получится следующее:

введите сюда описание изображения

Как видно, результат такой же как и в предыдущем эксперименте во время модели tv1 (tv4, tv5)

2) Но вот если убрать символ +, то на этот раз эксперимент дает совсем иной результат, отмечу что результат на этот раз вполне понятен и на логичном и на интуитивном уровнях:

введите сюда описание изображения


Ответы (1 шт):

Автор решения: pavlofff

Гайд от google про этот плюс пишет следующее:

Символ плюса (+) обозначает, что это имя нового ресурса, который необходимо создать и добавить к нашим ресурсам

то есть, создать запись в файле ресурсов R.java, который установит связь между текстовой меткой и непосредственно ID - числом, именно с которым и работает компилятор. Соответственно, если ресурс не создан, с ним невозможно работать, в том числе делать к нему привязку, так как нет для него записи в R.

Присвоение id виджетам идет по "тексту" xml-файла (просто сверху вниз). с плюсом должно быть первое упоминание каждого нового id, а не обязательно только в атрибуте присвоения android.id. То есть, в вашем случае первое упоминание виджетов tv4 и tv5 идет в атрибуте привязки первого виджета (tv1) к тому, что ниже "по тексту" (tv4 и tv5), в первом виджете и должен быть плюс у id tv4 и tv5, так как он выше "по тексту", чем 4 и 5. Далее, при описании виджета, к которому привязывались уже не надо указывать плюс в атрибуте android.id (у виджетов tv4 и tv5, если смотреть по первому скрину)

вот пример от гугл с relativelayout демонстрирует то же, что я описал выше. В спиннере dates привязка к левому краю виджета names указывается через плюс, так как сам виджет names располагается ниже по разметке, у самого виджета names атрибут android.id при этом уже без плюса. Прочие связи с виджетами в спиннере указываются без плюса, так как эти виджеты идут выше спиннера .

Если делать привязки к id, которые еще не присвоены (не указан плюс перед именем id), то они просто игнорируются (равносильно тому, что строки нет вовсе), как и большинство других некоректных атрибутов в xml-разметке. При этом, если вы укажите плюс еще раз (при следующих упоминаниях этого виджета), то ничего страшного не случится, он так же просто проигнорируется.

Если делать так же, то все будет отображаться корректно, мне кажется это все, что нужно знать о применении плюса.

→ Ссылка