28

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

Я пытался что-то вроде

в Рез/макет/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" 
     ... 
/> 

в Рез/значения/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> 

в разрешении/ценности-суша /integers.xml:

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

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

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

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

ответ

23

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

Я имею в виду файл 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

Спасибо Keyhan, я дам ему попробовать и сообщить здесь. Помог ли этот подход и в этом вопросе? http://stackoverflow.com/questions/9745227/setting-programmatically-the-pixel-size-of-a-remote-imageview. У меня есть 5 разных размеров раз в два режима (портрет и langscape). Используйте стиль для управления размером ImageView? Таким образом, у меня будет один макет с двумя изображениями и 5 пар стилей ориентации/портрета. (работа с ограничениями RemoteViews не является забавой ;-)). – user1139880

+0

Хорошо работает. Это была большая помощь !. Спасибо, Кейхан. – user1139880

+0

Предлагаемое решение включает использование [Style Resources] (http://developer.android.com/guide/topics/resources/style-resource.html) – denispyr

0

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

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

  1. Рез/макет/may_layout.xml
  2. Рез/макета земли/may_layout.xml

Что каждый определить правильный ImageView, чтобы показать.

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

+1

Спасибо Calvin. Я пытался избежать дублирования макета, если я не могу автоматически генерировать их из шаблона во время сборки. Не знаю, поддерживает ли eclipse и насколько он будет стандартным. – user1139880

39

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

Если вы проверяете Рез/значения/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. Выберите тот, который подходит вам лучше.

+5

Он также работает, объявляя их как «», а не «» – TalkLittle

+0

. Хорошая практика заключалась бы в том, чтобы сохранить исходные значения андроида для видимых, невидимых и ушедших (не 0, 1, 2, а 0, 4, 8) –

+3

Ну , это не исключает, как это работает. Если вы проверите код класса «View», эти значения (0, 1 и 2) используются для доступа к позициям этого элемента: 'private static final int [] VISIBILITY_FLAGS = {VISIBLE, INVISIBLE, GONE};'. Вот почему вы не можете использовать 0, 4 и 8, потому что цифры 0, 1 и 2 обозначают индексы VISIBLE, INVISIBLE и GONE. –