Управление видимостью вида из ресурсов - PullRequest
35 голосов
/ 17 марта 2012

У меня есть макет, который содержит два 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 ​​/ inteers.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 / inteers.xml:

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

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

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

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

Ответы [ 3 ]

49 голосов
/ 16 января 2013

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

Если вы проверите 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) соответственно.Таким образом, вы можете объявить целочисленные ресурсы, содержащие эти значения, например:

values ​​/ inteers.xml

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

values-land / inteers.xml

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

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

values ​​/ inteers.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 -->

values-land /Integers.xml

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

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

26 голосов
/ 17 марта 2012

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

Я имею в виду в файле 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 для второго.

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

0 голосов
/ 17 марта 2012

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

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

  1. Рез / макет / may_layout.xml
  2. Рез / планировка-земля / may_layout.xml

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

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

...