【Interface&navigation】风格和主题(21)

Android上的样式和主题允许您将应用程序设计的详细信息与UI结构和行为分开,类似于Web设计中的样式表。

一个风格是指定一个单一的外观属性的集合View。样式可以指定字体颜色,字体大小,背景颜色等属性。

一个主题是一个类型的风格,真实应用到整个应用程序,活动或视图层次结构,不仅是个人观点。将样式应用为主题时,应用程序或活动中的每个视图都会应用它支持的每个样式属性。主题还可以将样式应用于非视图元素,例如状态栏和窗口背景。

样式和主题在样式资源文件中声明res/values/,通常命名为styles.xml。

【Interface&navigation】风格和主题(21)
图1.应用于同一活动的两个主题:( Theme.AppCompat左)和Theme.AppCompat.Light(右)

创建并应用样式


要创建新样式或主题,请打开项目的res/values/styles.xml 文件。对于要创建的每种样式,请按照下列步骤操作:

添加一个<style>名称唯一标识样式的元素。
<item>为要定义的每个样式属性添加元素。
在name每个项目指定否则你将在你的布局XML属性使用属性。在所述值<item>元素是该属性的值。

例如,如果您定义以下样式:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="GreenText" parent="TextAppearance.AppCompat">
        <item name="android:textColor">#00FF00</item>
    </style>
</resources>

您可以将样式应用于视图,如下所示:

<TextView
    style="@style/GreenText"
    ... />

如果视图接受该样式,则该样式中指定的每个属性都将应用于该视图。视图只是忽略它不接受的任何属性。

注意: 只有添加style属性的元素才会接收这些样式属性 - 任何子视图都不会应用样式。如果希望子视图继承样式,请使用android:theme属性应用样式 。

但是,您通常会将样式应用为整个应用,活动或视图集合的主题,而不是将样式应用于单个视图。

扩展和自定义样式


在创建自己的样式时,应始终从框架或支持库扩展现有样式,以便保持与平台UI样式的兼容性。要扩展样式,请指定要使用该parent属性扩展的样式。然后,您可以覆盖继承的样式属性并添加新属性。

例如,您可以继承Android平台的默认文本外观并按如下所示进行修改:

<style name="GreenText" parent="@android:style/TextAppearance">
    <item name="android:textColor">#00FF00</item>
</style>

但是,您应该始终从Android支持库继承您的核心应用程序样式。支持库中的样式通过优化每个版本中可用的UI属性的每种样式,提供与Android 4.0(API级别14)及更高版本的兼容性。支持库样式的名称通常与平台的样式类似,但AppCompat包含在内。

要从库或您自己的项目继承样式,请声明父样式名称, 而不@android:style/显示上面显示的部分。例如,以下示例从支持库继承文本外观样式:

<style name="GreenText" parent="TextAppearance.AppCompat">
    <item name="android:textColor">#00FF00</item>
</style>

您还可以通过使用点表示法扩展样式名称而不是使用parent属性来继承样式(平台上的样式除外)。也就是说,在样式名称前面加上要继承的样式的名称,用句点分隔。通常只在扩展自己的样式时才这样做,而不是从其他库中扩展样式。例如,以下样式从GreenText上面的样式继承所有样式,然后增加文本大小:

<style name="GreenText.Large">
    <item name="android:textSize">22dp</item>
</style>

您可以通过链接更多名称继续多次继承这样的样式。

注意: 如果使用点表示法扩展样式,并且还包括 parent属性,则父样式将覆盖通过点表示法继承的任何样式。

要查找可以使用<item>标记声明的属性,请参阅各种类引用中的“XML属性”表。所有视图都支持基View类的XML属性,许多视图都添加了自己的特殊属性。例如,TextView XML属性包括可以应用于接收输入的文本视图的属性,例如窗口小部件。 android:inputTypeEditText

将样式应用为主题


您可以像创建样式一样创建主题。不同之处在于如何应用它:不是style在视图上应用具有该属性的样式,而是android:theme在<application>标记或文件中的 <activity>标记上应用具有该属性的主题AndroidManifest.xml。

例如,以下是如何将Android支持库的材料设计“黑暗”主题应用于整个应用程序:

<manifest ... >
    <application android:theme="@style/Theme.AppCompat" ... >
    </application>
</manifest>

以下是如何将“轻”主题应用于一个活动:

<manifest ... >
    <application ... >
        <activity android:theme="@style/Theme.AppCompat.Light" ... >
        </activity>
    </application>
</manifest>

现在,应用程序或活动中的每个视图都应用给定主题中定义的样式。如果视图仅支持样式中声明的某些属性,则它仅应用这些属性并忽略它不支持的属性。

从Android 5.0(API级别21)和Android支持库v22.1开始,您还可以android:theme在布局文件中为视图指定属性。这会修改该视图和任何子视图的主题,这对于更改界面特定部分中的主题调色板很有用。

前面的示例显示了如何应用Theme.AppCompat Android支持库提供的主题。但您通常希望自定义主题以适合您应用的品牌。最好的方法是从支持库扩展这些样式并覆盖一些属性,如下一节所述。

自定义默认主题


使用Android Studio创建项目时,默认情况下会将材质设计主题应用于您的应用,如项目styles.xml文件中所定义。此 AppTheme样式从支持库扩展主题,并包括关键UI元素使用的颜色属性的覆盖,例如应用栏和浮动操作按钮(如果使用)。因此,您可以通过更新提供的颜色快速自定义应用程序的颜色设计。

例如,您的styles.xml文件应该类似于:

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

请注意,样式值实际上是对项目文件中定义的其他颜色资源的引用res/values/colors.xml。这就是你应该编辑的文件来改变颜色。但在开始更改这些颜色之前,请使用“ 材质颜色工具”预览颜色 。此工具可帮助您从材质调色板中选择颜色并预览它们在应用中的外观。

知道颜色后,请更新以下值res/values/colors.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--   color for the app bar and other primary UI elements -->
    <color name="colorPrimary">#3F51B5</color>

    <!--   a darker variant of the primary color, used for
           the status bar (on Android 5.0+) and contextual app bars -->
    <color name="colorPrimaryDark">#303F9F</color>

    <!--   a secondary color for controls like checkboxes and text fields -->
    <color name="colorAccent">#FF4081</color>
</resources>

然后你可以覆盖你想要的任何其他风格。例如,您可以更改活动背景颜色,如下所示:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    ...
    <item name="android:windowBackground">@color/activityBackground</item>
</style>

有关可在主题中使用的属性列表,请参阅属性表R.styleable.Theme。在为布局中的视图添加样式时,还可以通过查看视图类引用中的“XML属性”表来查找属性。例如,所有视图都支持基View类的XML属性。

大多数属性都应用于特定类型的视图,有些属性适用于所有视图。但是,列出的某些主题属性R.styleable.Theme 适用于活动窗口,而不适用于布局中的视图。例如,windowBackground更改窗口背景并windowEnterTransition定义活动开始时要使用的过渡动画(有关详细信息,请参阅使用动画启动活动)。

Android支持库还提供了其他属性,您可以使用Theme.AppCompat这些colorPrimary 属性来自定义扩展的主题(例如上面显示的属性)。这些最好在 库的attrs.xml文件中查看

注意:支持库中的属性名称不使用android:前缀。这仅用于Android框架的属性。

可能希望扩展支持库中的不同主题,而不是上面显示的主题。查看可用主题的最佳位置是库的themes.xml文件。

添加特定于版本的样式


如果新版Android添加了您要使用的主题属性,则可以将其添加到主题中,同时仍与旧版本兼容。您只需要styles.xml保存在values包含资源版本限定符的目录中的 另一个 文件。例如:

res/values/styles.xml        # themes for all versions
res/values-v21/styles.xml    # themes for API level 21+ only

由于values/styles.xml文件中的样式适用于所有版本,因此您的主题values-v21/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>
</resources>

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

有关为不同设备使用备用资源的更多信息,请阅读 提供资源。

自定义小部件样式


框架和支持库中的每个小部件都具有默认样式。例如,当您使用支持图库中的主题设置应用程序样式时,将Button使用该 Widget.AppCompat.Button样式设置样式。如果您想将不同的窗口小部件样式应用于按钮,则可以使用style布局文件中的属性执行此操作。例如,以下应用库的无边框按钮样式:

<Button
    style="@style/Widget.AppCompat.Button.Borderless"
    ... />

如果您想将此样式应用于所有按钮,您可以在主题中声明它,buttonStyle如下所示:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="buttonStyle">@style/Widget.AppCompat.Button.Borderless</item>
    ...
</style>

您还可以扩展窗口小部件样式,就像扩展任何其他样式一样,然后在布局或主题中应用自定义窗口小部件样式。

要发现支持库中提供的所有备用窗口小部件样式,请查看以R.style字段开头的字段的 引用 Widget。(忽略以...开头的样式Base_Widget。)在资源中使用样式名称时,请记住用句点替换所有下划线。

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

【Interface&navigation】风格和主题(21)

猜你喜欢

转载自blog.51cto.com/4789781/2140172