styles.xml和themes.xml之间有什么区别?

73

请问 styles.xmlthemes.xml 有什么区别?对我来说,它们看起来一样,因为两个 XML 都是相同的格式。

<style name="...
    <item name="...

因此,在我提供自定义颜色、大小、可绘制等功能的应用程序中,我是否需要同时使用styles.xmlthemes.xml?我该如何决定将哪个XML放在哪个文件中?

6个回答

91

在整个页面的样式和主题中,您可能正在寻找这一行。

当您将样式应用于布局中的单个视图时,样式定义的属性仅应用于该视图。如果将样式应用于ViewGroup,则子View元素将不会继承样式属性,只有直接应用样式的元素将应用其属性。但是,您可以将样式应用为主题,以使其适用于所有View元素。

当您将其作为主题应用时,它会改变范围内的所有内容,具体取决于您是否将其应用于Activity或Application。样式更加“局部”。


57
不,它没有解释这两个文件之间的区别,只是解释了概念上的不同。然而,在大多数示例中,我们可以看到您将"MyTheme"放入styles.xml中,并在清单中将其用作主题。例如,要能够使用:<application android:theme="@style/CustomTheme">,在清单中,不清楚您是否需要在styles.xml或themes.xml中定义CustomTheme,或者它们中的任何一个都可以。 - Gavriel
3
这并没有完全涵盖styles.xml和themes.xml之间的区别。请看@iceagleanswer 这里 - Behzad Bahmanyar
为什么 <TextView style="@style/myStyle" ... /> 不会覆盖父样式? - Gilberto Ibarra
@GilbertoIbarra 因为它没有继承自它。样式不会进行层叠。 - Mickäel A.

41

引用自Android API指南:

要创建一组样式,请在项目的res/values/目录中保存一个XML文件。XML文件的名称是任意的,但必须使用.xml扩展名并保存在res/values/文件夹中。 XML文件的根节点必须是<resources>

完整文档

因此,只要是位于res/values/文件夹中的XML文件,将样式放在哪个文件都不重要。


11
人们使用styles.xml和themes.xml的原因是为了区分应用于单个视图的样式和应用于整个活动/应用程序的主题样式,这样可以更轻松地筛选出所有不同的样式。 - shoke

15

许多答案都表明,styles.xml和themes.xml之间没有功能上的区别。

值得注意的是,谷歌的iosched2014应用只有一个styles.xml文件(没有themes.xml文件)。

https://github.com/google/iosched


Android Studio现在默认生成themes.xml而不是styles.xml。 - Mohamed Salah

4

摘自样式和主题文档,定义样式一节:

To create a set of styles, save an XML file in the res/values/ directory of your project. The name of the XML file is arbitrary, but it must use the .xml extension and be saved in the res/values/ folder.

The root node of the XML file must be <resources>.

1
我刚意识到,例如工具栏文本颜色需要在主题声明中设置,而其他方面需要在样式声明中设置。
<style name="ToolbarTheme" parent="ThemeOverlay.AppCompat.Light">
    <item name="android:textColorPrimary">@android:color/white</item>
    <item name="android:textColorSecondary">@android:color/white</item>
</style>

<style name="ToolbarStyle" parent="Base.Widget.AppCompat.Toolbar">
    <item name="android:minHeight">?attr/actionBarSize</item>
    <item name="android:background">@color/colorPrimary</item>
</style>

并且在工具栏声明中

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    style="@style/ToolbarStyle"
    android:theme="@style/ToolbarTheme">
</android.support.v7.widget.Toolbar>

我试图通过将主题项移动到样式中来省略主题,但这并没有起作用。因此,在这种情况下,似乎这些只是样式,因为它们影响工具栏中继承的子元素,例如文本字段。

-5

您好,这是一篇关于在Android中XML样式和主题之间区别的文章请查看

此外,以下是Android关于样式和主题的文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接