这是为不同版本提供不同值/样式的正确方法

时间:2016-03-20 10:06:35

标签: android

Android Studio 2.1 preview 3

这只是一个问题,因为我很困惑,因为我已经看到了许多替代方案。

我创建了一个新的android项目,我的Activity扩展了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中的所有颜色,所以我必须重复这个吗?

6 个答案:

答案 0 :(得分:38)

这是正确的方式。我可以建议你更好地组织你的风格吗?

<强>值/ 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级别重复该样式的常用值。

答案 1 :(得分:12)

我会尝试回答它,并提供一些参考资料

Maintaining Compatibility

  

为避免重复代码,请在res / values /中定义样式,   修改res / values-v21 /中的样式以用于新API,并使用样式   继承,在res / values /中定义基本样式并继承自   res / values-v21 /

中的那些

因此,您应该尝试使用样式继承来避免style.xml位于不同文件夹res/values/res/values-v21/的代码重复。

Style Inheritence

  

如果您想继承您自己定义的样式,那么您   不必使用parent属性。相反,只需在名称前加上前缀   您要继承的样式的样式,   被一段时间隔开。

如果您想继承自己定义的样式,可以跳过添加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"

答案 2 :(得分:4)

  

1)这是正确的方法,还是有更好的方法吗?

是。这是为不同的API版本提供不同值的正确/推荐方法。

  

2)values21 / styles会继承值/样式中的所有颜色,所以我必须重复这个吗?

我不确定我是否完全遵循这个问题。您展示的两种样式都将继承android:windowTranslucentStatus,因此您的颜色应该再次声明,但我会提出两种更好的选择:

备选方案1,好一点:

使用两者共有的BaseTheme。要查看代码,请查看@ mimmo-grottoli answer。

备选方案2,更好:

如果两个主题上唯一不同的是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> ,您可以将它们全部放在值/样式的相同主题中,如下所示:

windowTranslucentStatus

Android Framework会忽略它无法识别的XML参数。这意味着在JellyBean或ICS上,设备将在正确应用颜色时忽略windowTranslucentStatus,而在KitKat及更高版本中,它将正确应用 ResultSet rs = ps.executeQuery(sql);

这个棘手的问题适用于Android中的所有XML(甚至是布局),IDE可能会为您提供有关API级别的警告,但在XML中,它们始终可以安全使用。

答案 3 :(得分:2)

当您的应用在特定版本的Android上运行时,会生成不同的值/样式文件夹,以提供独特的样式。

所以是的,当你说新版本继承旧版本时,你是对的。在最新版本的样式中添加项目时,您可以将最新版本更新为最新的API。

总而言之,您的方式是非常通用的方式,它是一种有组织且干净的方式来保持您的应用更新。

答案 4 :(得分:2)

  
      
  1. 这是正确的方法,还是有更好的方法来做到这一点?
  2.   

是。这是为不同的API版本提供不同值的正确方法。

  

值-21 / styles会继承值/样式中的所有颜色,所以我必须重复这个吗?

答案 5 :(得分:0)

技术上<item name="android:windowTranslucentStatus">true</item>不会为您提供完全透明的状态栏。

如果您想要完全透明,可以使用<item name="android:statusBarColor">@android:color/transparent</item>