在v19 / v21中重复样式

时间:2015-09-22 19:50:09

标签: android android-layout android-xml android-theme android-styles

我在styles.xml

中有这个
<style name="UserTheme" parent="ThemeBase">
    <item name="android:editTextStyle">@style/EditTextTheme</item>
</style>

为什么我必须重复editTextStylev19/styles.xml中的v21/styles.xml行。

v21/styles.xml

<style name="UserTheme" parent="ThemeBase">
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">true</item>
    <item name="android:editTextStyle">@style/EditTextTheme</item>
</style>

有没有办法在主styles.xml中调用它并让它适用于所有地方,所以我不必多次写它?

3 个答案:

答案 0 :(得分:10)

我无法找到任何推荐的解决方案,因此我深入研究了AppCompat源代码。他们这样做是这样的。

在styles.xml中

    <style name="Base.V7.Theme.YourThemeName" parent="Theme.AppCompat.Light.NoActionBar">
    </style>

    <style name="Base.Theme.YourThemeName" parent="Base.V7.Theme.YourThemeName" />

    <style name="Theme.YourThemeName" parent="Base.Theme.YourThemeName" >
       <item name="colorPrimary">@color/primary</item>
       <item name="colorPrimaryDark">@color/primary_dark</item>
       <item name="colorAccent">@color/accent</item>
    </style>

在你的styles-v21.xml

    <style name="Base.V21.Theme.YourThemeName" parent="Base.V7.Theme.YourThemeName">
       <item name="android:navigationBarColor">@color/white</item>
       <item name="android:windowTranslucentStatus">true</item>
    </style>
    <style name="Base.Theme.YourThemeName" parent="Base.V21.Theme.YourThemeName" />

在你的styles-v22.xml

    <style name="Base.V22.Theme.YourThemeName" parent="Base.V21.Theme.YourThemeName">
       <item name="android:navigationBarColor">@color/black</item>
       <item name="android:windowTranslucentStatus">false</item>
    </style>
    <style name="Base.Theme.YourThemeName" parent="Base.V22.Theme.YourThemeName" />

对于每个新版本,您都会扩展以前的基本版本。如果您要覆盖不同版本的任何属性,只需将其放在新Base.VXX.Theme.YourThemeName文件的styles-vXX.xml块中。

答案 1 :(得分:3)

  
      
  1. 为什么我必须在v19 / styles.xml中重复editTextStyle行,并且   v21 / styles.xml?
  2.   

如果您对某些属性应用了STYLE,Android将在styles.xml文件中搜索api_level <= Android_device_api_level的最高api级别,并在其中搜索STYLE。如果找到,将应用该样式进行查看,否则将继续在较低api级文件中搜索该样式。

例如-如果您有四个文件styles.xml(默认值),v19 / styles.xml,v21 / styles.xml,v25 / styles.xml,并且您的设备在api级别24上运行,则它将在v21 /中搜索STYLE首先是styles.xml,然后是v19 / styles.xml,最后是styles.xml(默认)。只有第一次出现的STYLE才会被应用。因此,您不能仅在特定于版本的styles.xml文件中仅定义其他属性。

如果您不想重复通用属性,这里是一个替代方法。要声明Android 5.0(API级别21)及更高版本的窗口转换,您需要使用一些新属性。因此,res / values / styles.xml中的基本主题可能如下所示:

<resources>
    <!-- base set of styles that apply to all versions -->
    <style name="BaseAppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/primaryColor</item>
        <item name="colorPrimaryDark">@color/primaryTextColor</item>
        <item name="colorAccent">@color/secondaryColor</item>
    </style>

    <!-- declare the theme name that's actually applied in the manifest file -->
    <style name="AppTheme" parent="BaseAppTheme" />
</resources>

然后按如下所示在res / values-v21 / styles.xml中添加特定于版本的样式:

<resources>
<!-- extend the base theme to add styles available only with API level 21+ -->
<style name="AppTheme" parent="BaseAppTheme">
    <item name="android:windowActivityTransitions">true</item>
    <item name="android:windowEnterTransition">@android:transition/slide_right</item>
    <item name="android:windowExitTransition">@android:transition/slide_left</item>
</style>

现在,您可以在清单文件中应用AppTheme,然后系统为每个系统版本选择可用的样式。

  
      
  1. 有没有一种方法可以在主要styles.xml中调用它并拥有它   适用于所有地方,所以我不必多次编写?
  2.   

是的,有一种方法只能维护一个styles.xml文件。

首先,开始使用AppCompat主题。它们提供向后兼容性,并且也适用于较早的android版本。

现在在styles.xml(默认)文件中定义所有样式,如果您的Android Studio向您显示高级API支持的某些属性的警告/错误: Warning from andorid studio

您可以使用以下方法禁止显示该警告:tools:targetApi="SupportedAndroidVersionName" enter image description here

现在,如果不支持该特定属性,Android将忽略该属性,并且您的整个样式对于较低和较高的api级别都将完美运行。

详细了解样式和主题here

希望它会有所帮助:)

答案 2 :(得分:1)

较新版本的Android具有应用程序可用的其他主题,您可能希望在这些平台上运行时使用这些主题,同时仍与旧版本兼容。您可以通过自定义主题实现此目的,该主题使用资源选择根据平台版本在不同的父主题之间切换。

  

为什么我必须重复using Newtonsoft.Json; using System.Linq; using Windows.Security.Credentials; using Windows.Storage; namespace Your.Namespace { public class StateService { public void SaveState<T>(string key, T value) { var localSettings = ApplicationData.Current.LocalSettings; localSettings.Values[key] = JsonConvert.SerializeObject(value); } public T LoadState<T>(string key) { var localSettings = ApplicationData.Current.LocalSettings; if (localSettings.Values.ContainsKey(key)) return JsonConvert.DeserializeObject<T>(((string) localSettings.Values[key])); return default(T); } public void RemoveState(string key) { var localSettings = ApplicationData.Current.LocalSettings; if (localSettings.Values.ContainsKey(key)) localSettings.Values.Remove((key)); } public void Clear() { ApplicationData.Current.LocalSettings.Values.Clear(); } } } 中的editTextStyle行   v19/styles.xml

因为如果您的应用程序在v21/styles.xml上运行,则会加载v21,如果在v21/styles.xml上运行,则会加载v19。如果您没有v19/styles.xmlv21/styles.xml,该应用会自动使用您的默认v19/styles.xml,但您无法利用仅为values/styles.xml提供的新功能或v21

有关详情,请参阅Supporting Different DevicesSelect a theme based on platform version