2015-02-20 3 views
3

Я хочу установить элемент в некоторых стилях моего приложения. Сейчас высота составляет только 21 и выше, без библиотеки поддержки, так что моя естественная склонность было просто создать стили-V21 XML и поместить его туда:Дизайн материалов: Где разместить высоту в стилях андроида?

<style name="Widget.MyApp.Drawer" parent="ThemeOverlay.AppCompat.Dark.ActionBar"> 
    <item name="android:elevation">4dp</item> 
</style> 

Проблема с этим какие-либо изменения, которые я делаю в виджете. MyApp.Drawer в регулярном файле styles.xml будет полностью перезаписан. Я бы хотел, чтобы высота была просто привязана к нижней части списка изменений стиля, которые я сделал для версии этого стиля v21, указанной в styles.xml.

Так что я взял на создание базовых стилей, стиль я использую в представлениях унаследованы от:

<style name="BaseListElement"> 
    <item name="android:background">@drawable/listitem_background</item> 
    <item name="android:layout_height">@dimen/list_item_height</item> 
</style> 

<style name="BaseListElement.ListItem"> 

</style> 

Я оставляю стиль пустого в styles.xml, и в стилях-v21, добавить высоту и его работает.

Однако вид Получить по хитрым, когда я хочу использовать некоторые стили:

<style name="BaseListElement"> 
    <item name="android:background">@drawable/listitem_background</item> 
    <item name="android:layout_height">@dimen/list_item_height</item> 
</style> 

<style name="BaseListElement.BaseItem"> 
    <item name="android:padding">@dimen/list_item_padding</item> 
</style> 

<style name="Widget.MyApp.ListItem" parent="@style/BaseListElement.BaseItem"> 

</style> 

<style name="BaseListElement.BaseHeader"> 

</style> 

В этом случае BaseItem только один стиль, который наследует от BaseListElement, стили, такие как BaseHeader наследовать от него, а также. Это становится нелепым, как вы можете видеть.

Я переусердствовал это? Как я вижу это у меня есть 3 варианта здесь:

1) Продолжить как есть и чувствовать себя как идиот

2) На уровне BaseListElement, создать дочерний стиль с каким-то бестолковым именем, которое является точкой, в которой Я применяю высоту, которая затем (надеюсь) просачивалась бы ко всем детям. Как только у меня есть разница между v21 детьми базы, это не сработает.

3) Просто выбросьте android:elevation в файл styles.xml (не используйте файл v21) и поместите на элемент флаг игнорирования. У меня только 5,0 устройств здесь, поэтому я не могу легко проверить на данный момент, если это приведет к сбою в старых версиях.

Любые мысли?

+0

вы можете проверить 3 на эмуляторе? Genymotion очень прост в настройке. –

ответ

5

Чтобы выполнить что-то подобное, вы можете просто создать BaseListElement.BaseItem как в styles.xml, так и в syles-v21.xml первый, без отметки, и второй с ним. Затем просто увеличьте Widget.MyApp.ListItem от BaseListElement.BaseItem, который должен обновиться в v21, чтобы использовать elevation.

styles.xml

<style name="BaseListElement.BaseItem"> 

</style> 

<style name="Widget.MyApp.ListItem" parent="@style/BaseListElement.BaseItem"> 

</style> 

стили-v21.xml

<style name="BaseListElement.BaseItem"> 
    <item name="android:padding">@dimen/list_item_padding</item> 
</style> 

Метод 3 можно безопасно осуществить следующим образом:

<item name="android:elevation" tools:ignore="NewApi">4dp</item> 
Смежные вопросы