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

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

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"

Только некоторые вопросы

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

Ответ 1

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

<сильные > значения /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.

Ответ 2

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

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

Чтобы избежать дублирования кода, определите свои стили внутри res/values ​​/, изменить стили в res/values-v21/для новых API и использовать стиль наследование, определение базовых стилей в res/values ​​/и наследование из те в res/values-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 в BaseTheme.StyledStatusBar

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

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

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

Ответ 3

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

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

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

Я не уверен, что полностью соблюдаю этот вопрос. Оба стили, которые вы указали, наследуют от 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 они всегда безопасны в использовании.

Ответ 4

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

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

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

Ответ 5

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

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

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

Да

Ответ 6

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

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