Контроль видимости видимости из ресурсов

У меня есть макет, содержащий два ImageViews. Я хочу, чтобы один из них был виден на портрете, а другой – в пейзаже. Как я могу достичь этого, используя ресурсы? (Я знаю, как установить его программно, но это конкретное использование, которое мне нужно для его достижения, используя ресурсы).

Я попробовал что-то вроде

В res / layout / may_layout.xml:

... <ImageView android:id="@+id/image1" android:visibility="@integer/visible_in_portrait" <<-- is this allowed? ... /> <ImageView android:id="@+id/image2" android:visibility="@integer/visible_in_landscape" ... /> 

В res / values ​​/ integers.xml:

 ... <!-- NOTE: 0 and 8 are VISIBLE and GONE respectively --> <integer name="visibile_in_portrait">0</integer> <integer name="visibile_in_landscape">8</integer> 

В res / values-land / integers.xml:

 ... <integer name="visibile_in_portrait">8</integer> <integer name="visibile_in_landscape">0</integer> 

Но при попытке надуть изображения я получаю ошибку времени выполнения (индекс из привязки). Когда я удаляю инструкции android: visibility, программа запускается, но я вижу оба изображения.

В: Каков способ использования ресурса в качестве значения для атрибута android: visibility?

(Если вы задаетесь вопросом, почему установка программно не поможет мне, это связано с автоматическим переключением ландшафтного / портретного переключателя виджетов приложений с растровыми изображениями файлов uri).

Solutions Collecting From Web of "Контроль видимости видимости из ресурсов"

Это будет возможно, когда вы используете этот трюк, добавьте свою линию видимости в стиль и поместите два экземпляра этого файла в режиме «Обычный» и «Обычный».

Я имею в виду, что в файле styles.xml в values папки помещается стиль с именем s1 и помещается android:visibility=visible в этом, а в styles.xml в values-land папки values-land помещает стиль с именем s1 и помещает android:visibility=gone .

Кроме того, в файле styles.xml в values папок помещается стиль с именем s2 и помещается android:visibility=gone в это, а в styles.xml в values-land папки values-land помещал стиль с именем s2 и помещал android:visibility=visible .

А затем установите s1 в первое представление изображения и s2 на второе.

Решение, данное уважаемым Кальвином, также является правильным, но когда у вас сложный макет, который может измениться во времени, наличие одного файла макета будет лучше, и ему будет меньше необходимости изменять.

Это старый вопрос, который уже принят, но следующее решение может помочь кому-то другому:

Если вы проверите res / values ​​/ attrs.xml в исходном коде Android, вы увидите определение свойства видимости следующим образом:

  <!-- Controls the initial visibility of the view. --> <attr name="visibility"> <!-- Visible on screen; the default value. --> <enum name="visible" value="0" /> <!-- Not displayed, but taken into account during layout (space is left for it). --> <enum name="invisible" value="1" /> <!-- Completely hidden, as if the view had not been added. --> <enum name="gone" value="2" /> </attr> 

Этот атрибут ожидает строковое значение (видимое, невидимое, ушедшее), которое будет преобразовано в (0, 1, 2) соответственно. Таким образом, вы можете объявить целочисленные ресурсы, содержащие эти значения следующим образом:

Значения / integers.xml

 <integer name="visible_in_portrait">2</integer> <!-- This is GONE --> 

Значения-земля / integers.xml

 <integer name="visible_in_landscape">0</integer> <!-- This is VISIBLE --> 

Однако, если вы хотите сделать это еще лучше, чтобы перестать гадать эти числовые константы каждый раз, вы можете сделать вот так:

Значения / integers.xml

 <!-- These are alias for the constants we'll reference below --> <integer name="view_visible">0</integer> <!-- This is VISIBLE --> <integer name="view_invisible">1</integer> <!-- This is INVISIBLE --> <integer name="view_gone">2</integer> <!-- This is GONE --> <integer name="visible_in_portrait">@integer/view_gone</integer> <!-- We're referencing the visibility alias we declared above --> 

Значения-земля / integers.xml

 <integer name="visible_in_landscape">@integer/view_visible</integer> 

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

Это невозможно. (Я попытался определить fill_parent как строку и использовать его для layout_width, и он тоже не работает.)

Почему бы вам не использовать 2 макета?

  1. разреш / макет / may_layout.xml
  2. разреш / макет земля / may_layout.xml

Каждый из них определяет правильное изображение.

Кроме того, наличие ценностей-земли может вызвать проблемы, когда вам необходимо поддерживать несколько языков. (Для каждого языка вам необходимо иметь значение-xx-land)