Контроль видимости видимости из ресурсов
У меня есть макет, содержащий два 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).
Ответы
Ответ 1
это будет возможно, когда вы используете этот трюк, добавьте свою линию видимости в стиль и поместите два экземпляра этого файла в режиме "Обычный" и "Обычный".
Я имею в виду в файле styles.xml
в папке values
поместил стиль с именем s1
и поместил android:visibility=visible
в это, а в styles.xml
в папку values-land
поместил стиль с именем s1
, и положите android:visibility=gone
.
также в файле styles.xml
в папке values
введите стиль с именем s2
и поместите в него android:visibility=gone
, а в styles.xml
в папке values-land
введите стиль с именем s2
, и поместите android:visibility=visible
.
а затем установите s1
в первое изображение и s2
на второй.
решение, данное уважаемым Кальвином, также является правильным, но когда у вас сложный макет, который может измениться во времени, наличие одного файла макета будет лучше, и ему будет меньше необходимости изменять.
Ответ 2
Это старый вопрос, который уже принят, но следующее решение может помочь кому-то еще:
Если вы проверили 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>
Вы можете использовать этот подход или тот, который предлагается Keyhan. Выберите тот, который лучше подходит для вас.
Ответ 3
Это невозможно. (Я попытался определить fill_parent как строку и использовать его для layout_width, и он тоже не работает.)
Почему бы вам не использовать 2 макета?
- Рез/макет/may_layout.xml
- Рез/макета земля /may _layout.xml
Каждый из них определяет правильное изображение для отображения.
Кроме того, наличие значений-земли может вызвать проблемы, когда вам необходимо поддерживать несколько языков. (Для каждого языка вам нужно иметь значение-xx-land)