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"
只是一些问题
values-21/styles
会继承values/styles
中的所有颜色,所以我必须重复这个吗?答案 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)
我会尝试回答它,并提供一些参考资料
为避免重复代码,请在res / values /中定义样式, 修改res / values-v21 /中的样式以用于新API,并使用样式 继承,在res / values /中定义基本样式并继承自 res / values-v21 /
中的那些
因此,您应该尝试使用样式继承来避免style.xml
位于不同文件夹res/values/
和res/values-v21/
的代码重复。
如果您想继承您自己定义的样式,那么您 不必使用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)
- 这是正确的方法,还是有更好的方法来做到这一点?
醇>
是。这是为不同的API版本提供不同值的正确方法。
值-21 / styles会继承值/样式中的所有颜色,所以我必须重复这个吗?
是
答案 5 :(得分:0)
技术上<item name="android:windowTranslucentStatus">true</item>
不会为您提供完全透明的状态栏。
如果您想要完全透明,可以使用<item name="android:statusBarColor">@android:color/transparent</item>