android - 我是否需要创建重复的 XML 文件来支持应用程序样式的向后兼容性?

标签 android xml android-styles

我正在尝试找到一种方法来为 Android 编写更少且更易于理解的样式。有时我在调试时很费劲,我浪费了很多时间只是为了找出为什么其中一个操作栏的 View 没有正确的文本颜色(这是一个例子)。

我想你知道我想说什么......你打开了两个 XML 文件(一个在左边,另一个在你的 IDE 的右边)并且你正在尝试识别每个 XML 标签并且你正在应用不同的布局属性来支持旧版本 Android 的向后兼容性。

举个例子:自定义actionbar。

我们的 list 文件:

<application 
name="com.app.App"
theme="@style/AppTheme.NoActionBar" > ...

目前,您需要创建两个(或更多)XML 文件以将以下属性应用到您的操作栏:

API <= 10

res/values/themes.xml

    <style name="AppTheme.NoActionBar" parent="@style/Theme.AppCompat.Light">
        <item name="windowActionBar">false</item>
    </style>

API > 10

res/values-v11/themes.xml

    <style name="AppTheme.NoActionBar" parent="@style/Theme.AppCompat.Light">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowActionBar">false</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowContentOverlay">@null</item>
    </style>

这样我们就从 Activity 中删除了操作栏。但是,这还不完整,因为在 API <= 10 上,屏幕不会像在 API > 10 上那样全屏显示。您将在 Activity 的顶部看到应用程序的标签。因此,要在两种不同的设备上使用相同的设计,您需要向 Activity 中添加更多代码:

@Override
protected void onCreate(Bundle bundle) {
   super.onCreate(bundle);
   requestWindowFeature(Window.FEATURE_NO_TITLE);
   getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
}

这是一个小示例,但是当您在文件中声明了很多很多样式时,这会变得更加复杂。在某些时候你会迷路。

我想做的是简化工作。

我能否合并 XML 文件而不会出现编译错误且不会复制 XML 文件?

res/values-v11/themes.xml

<style name="AppTheme.NoActionBar" parent="@style/Theme.AppCompat.Light">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowActionBar">false</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowContentOverlay">@null</item>

    <item name="windowActionBar">false</item>
</style>

上面的代码不适用于 API <= 10,但下面的代码可以:

res/values/themes.xml

<style name="AppTheme.NoActionBar" parent="@style/Theme.AppCompat.Light">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowContentOverlay">@null</item>

    <item name="windowActionBar">false</item>
</style>

上面的代码是有效的,但是一些属性需要 Android 的命名空间:android:tag。否则,您的 IDE 将不会编译您的项目。

因此,为了抑制错误,我们可以使用 xmlns:tools,这将消除 lint 错误,您可以编译代码。但是,您可能还需要应用 tools:targetApi="lvl" 属性:

res/values/themes.xml

<resources xmlns:tools="http://schemas.android.com/tools">
    <style name="AppTheme.NoActionBar" parent="@style/Theme.AppCompat.Light">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowActionBar" tools:targetApi="11">false</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowContentOverlay">@null</item>

        <item name="windowActionBar">false</item>
    </style>
</resources>

这样维护你的代码要容易得多,而且你写的代码比创建 N 个 xml 文件要少。然而,有时,当您的 XML 文件中有超过 500 行时,事情会变得更加复杂。最糟糕的是,IDE 不会显示任何警告或错误,项目可以编译,但在不同的 Android 版本上布局会有所不同。

最后...有什么方法可以编写更少和更多的可维护性代码吗?

最佳答案

你可以这样做:

res/values/styles.xml

<resources>
    <styles>
        <style name="AppTheme.ActionBar.Common" parent="@style/Theme.AppCompat.Light">
            <!-- Common items -->
        </style>

        <style name="AppTheme.ActionBar" parent="@style/AppTheme.ActionBar.Common">
        </style>
    </styles>
</resources>

res/values-21/styles.xml

<resources>
    <styles>
        <style name="AppTheme.ActionBar" parent="@style/AppTheme.ActionBar.Common">
            <!-- Specified items for v21 -->
        </style>
    </styles>
</resources>

然后,您可以在任何您喜欢的地方使用 AppTheme.ActionBar,它将适用于所有版本:

<application 
    name="com.app.App"
    theme="@style/AppTheme.ActionBar" > ...

关于android - 我是否需要创建重复的 XML 文件来支持应用程序样式的向后兼容性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27412664/

相关文章:

android - 为 DialogFragment 上的导航栏设置颜色

android - GoogleMap API key 仅适用于调试 key

android - 我可以为参数值提供两个选项吗?

xml - xslt分组问题

php - 将 PHP PUT HTTP 请求转换为 ColdFusion

java - woodstox 跳过部分 xml

android - 如何在 Android 上以编程方式将样式设置为 progressBar

android - AppBarLayout elevation 隐藏工具栏

Android Button 始终保持在所有 Activity 之上以进行待机

android - ActionBar 按钮选择状态