安卓默认主题

22

我正在开发一款安卓应用,但我在思考主题的问题。

如果我没有声明我的安卓应用的主题,那么会使用哪个主题?我可以在哪里找到这些信息?选择主题的标准是什么?

我在考虑,如果我想要自定义我的整个应用,我需要扩展一个主题并自定义所有我想要定制的项。

如果它默认假设其中一个主题,怎么办?我还需要再自定义吗?我如何知道哪个是默认主题?


看一下这个:https://dev59.com/E2kw5IYBdhLWcg3whK88 - Antrromet
3个回答

21

默认主题因API级别而异(以保持与一般UI的一致性)。

在API<10上,该主题是一组样式(如下面链接中所示),称为Theme,在API 10以上,默认主题是Theme_Holo,现在从API 21开始,默认主题变为Theme.Material

这些样式中的大部分都可以通过android.support库获得。

PS:据我所知,浅色主题始终是默认主题。


如果我想在所有情况下都使用Theme_Holo,包括小于10的情况,该怎么办? - user1851366
1
然后你需要看一下叫做“HoloEverywhere”的东西,但现在已经没什么用了,因为AppCompat已经出来了... - shkschneider
1
@user1851366 如果要在版本低至7的设备上使用Holo甚至Material主题,您应该使用android support library v7。您可以使用AppCompat(提供Material Design Action Bar等)以及布局元素,如CardView或RecyclerView。这在Android官方网站上有很好的介绍。 - fragon

4

最好自己定义默认主题,而不是依赖于Android选择默认主题。这是因为不同版本的Android可能有完全不同的默认主题,可能会破坏您的布局。

您可以在AndroidManifest.xml中声明应用程序的主题。

<application android:theme="@style/MyTheme" .....>

然后在res/values文件夹中,您需要编辑或添加一个名为themes.xml的文件,并添加以下内容:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="MyTheme" parent="@android:style/Theme.Holo">
         ... customize your theme here
    </style>
</resources>

您可以编辑主题的parent,将其设置为任何您想要的内容...

如果您不想进行任何自定义,也可以直接在AndroidManifest.xml中使用@android:style/Theme.Holo

如果 API 版本低于 11,请使用Theme.AppCompat.Holo


2
App的默认主题实现在Resources.java中!
    /**
 * Returns the most appropriate default theme for the specified target SDK version.
 * <ul>
 * <li>Below API 11: Gingerbread
 * <li>APIs 11 thru 14: Holo
 * <li>APIs 14 thru XX: Device default dark
 * <li>API XX and above: Device default light with dark action bar
 * </ul>
 *
 * @param curTheme The current theme, or 0 if not specified.
 * @param targetSdkVersion The target SDK version.
 * @return A theme resource identifier
 * @hide
 */
public static int selectDefaultTheme(int curTheme, int targetSdkVersion) {
    return selectSystemTheme(curTheme, targetSdkVersion,
            com.android.internal.R.style.Theme,
            com.android.internal.R.style.Theme_Holo,
            com.android.internal.R.style.Theme_DeviceDefault,
            com.android.internal.R.style.Theme_DeviceDefault_Light_DarkActionBar);
}
/** @hide */
public static int selectSystemTheme(int curTheme, int targetSdkVersion, int orig, int holo,
        int dark, int deviceDefault) {
    if (curTheme != 0) {
        return curTheme;
    }
    if (targetSdkVersion < Build.VERSION_CODES.HONEYCOMB) {
        return orig;
    }
    if (targetSdkVersion < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
        return holo;
    }
    if (targetSdkVersion < Build.VERSION_CODES.CUR_DEVELOPMENT) {
        return dark;
    }
    return deviceDefault;
}

这取决于API级别,因此最好在AndroidManifest.xml中定义自己的AppTheme以确保在所有API级别设备上使用主题。请参考先前的答案。

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