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

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

У меня есть макет, содержащий два 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).

4b9b3361

Ответ 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)