Это правильный способ иметь разные значения / стили для разных версий

Android Studio 2.1 preview 3 

Это просто вопрос, так как я смущен, поскольку я видел много альтернатив в этом.

Я создал новый проект для Android, и моя активность расширяет AppCompatActivity

 public class MainActivity extends AppCompatActivity { 

Я хочу иметь transparent statusbar на устройствах, работающих 21 и более.

Поэтому в моих values/styles меня есть следующее

 <resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> </resources> 

И в моих values-21/styles меня есть следующее

 <resources> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <!-- Make the statusbar transparent --> <item name="android:windowTranslucentStatus">true</item> </style> </resources> 

Мой манифест Я выбираю тему

 android:theme="@style/AppTheme" 

Просто некоторые вопросы

  1. Правильно ли это, или есть ли лучший способ сделать это?
  2. Будут ли values-21/styles наследовать все цвета в values/styles поэтому я должен был бы повторить это?

Solutions Collecting From Web of "Это правильный способ иметь разные значения / стили для разных версий"

Это правильный путь. Могу ли я предложить вам лучше организовать свой стиль?

Значения / styles.xml

 <resources> <!-- Base application theme. --> <style name="AppTheme" parent="CommonTheme"> </style> <style name="CommonTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> </resources> 

Значения-V21 / styles.xml

 <resources> <!-- Base application theme. --> <style name="AppTheme" parent="CommonTheme"> <!-- All customization of the theme for this version --> <item name="android:windowTranslucentStatus">true</item> </style> </resources> 

Поэтому вам не нужно повторять общие значения стиля для каждого уровня api.

Я постараюсь ответить на него, давая некоторые ссылки

Поддержание совместимости

Чтобы избежать дублирования кода, определите свои стили внутри res / values ​​/, измените стили в res / values-v21 / для новых API-интерфейсов и используйте наследование стиля, определите базовые стили в res / values ​​/ и наследуйте их от res / значения-V21 /

Поэтому вам следует попытаться избежать дублирования кода в вашем style.xml в разных папках res/values/ и res/values-v21/ с помощью наследования стиля.

Наследование стиля

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

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

При этом вы можете определить базовую тему BaseTheme в res/values/ с разными цветами и наследовать ее как BaseTheme.StyledStatusBar без указания родительского атрибута.

 <resources> <style name="BaseTheme.StyledStatusBar"></style> <!-- Base application theme. --> <style name="BaseTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> </resources> 

В values-21/ android:windowTranslucentStatus values-21/ , добавьте элемент android:windowTranslucentStatus в BaseTheme.StyledStatusBar

 <resources> <style name="BaseTheme.StyledStatusBar"> <item name="android:windowTranslucentStatus">true</item> </style> </resources> 

В манифесте выберите тему

 android:theme="@style/BaseTheme.StyledStatusBar" 

1) Правильно ли это, или есть ли лучший способ сделать это?

Да. Это правильный / рекомендуемый способ иметь разные значения для разных версий API.

2) Значит ли значения21 / styles наследовать все цвета в значениях / стилях, поэтому я должен был бы повторить это?

Я не уверен, что полностью следую этому вопросу. Оба стили, которые вы Theme.AppCompat.Light.NoActionBar наследуют от Theme.AppCompat.Light.NoActionBar чтобы ваши цвета были снова объявлены, но я представлю две лучшие альтернативы:

Альтернатива 1, немного лучше:

Используйте BaseTheme, который является общим для обоих. Чтобы просмотреть код для этого, пожалуйста, проверьте @ mimmo-grottoli ответ.

Альтернатива 2, намного лучше:

Если единственной разницей по двум темам является android:windowTranslucentStatus который был введен в KitKat (уровень API 19), вы можете поместить все это в одну и ту же тему в значениях / стилях, например:

 <resources> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <!-- Make the statusbar transparent --> <item name="android:windowTranslucentStatus">true</item> </style> </resources> 

Android Framework игнорирует параметры XML, которые он не распознает. Это означает, что на JellyBean или ICS устройство будет игнорировать windowTranslucentStatus , правильно применяя цвета, а в KitKat и выше, это будет правильно применять windowTranslucentStatus .

Эта сложность действительна для всех XML в Android (даже макеты), IDE может дать вам предупреждения об уровне API, но в XML они всегда безопасны в использовании.

Различные папки значений / стилей создаются для создания уникального стиля, когда ваше приложение работает на определенной версии Android.

Итак, да, вы правы, когда говорите, что новая версия наследуется от более старой. При добавлении элементов в вашу последнюю версию стилей вы сохраняете последнюю версию до новейших API.

В заключение, ваш путь – это очень общий путь, это организованный и чистый способ обновить ваше приложение.

  1. Правильно ли это, или есть ли лучший способ сделать это?

Да. Это правильный способ иметь разные значения для разных версий API.

Будут ли значения-21 / styles наследовать все цвета в значениях / стилях, поэтому я должен был бы повторить это?

да

<item name="android:windowTranslucentStatus">true</item> не даст вам полностью прозрачную панель состояния.

Если вы хотите, чтобы он был полностью прозрачным, вы можете использовать <item name="android:statusBarColor">@android:color/transparent</item>