根据SDK版本动态加载首选项

时间:2013-04-06 02:01:37

标签: android android-layout preferences

我的Android应用程序中有一个PreferenceActivity,用于显示设置屏幕。我想在其中有一个“MultiSelectListPreference”,但我遇到了一个问题,它不适用于API的pre-API11版本,因为它是在API11中引入的。 没问题,在那里,我通过两个xml布局来解决这个问题,一个是位于res / xml-v11中的“MultiSelectListPreference”,另一个是位于res / xml中的“Preference”,我使用自定义对话框处理它。 / p>

res / xml-v11中的xml文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<Preference android:key="time"
            android:persistent="false"
            android:title="@string/time" />
<MultiSelectListPreference android:key="days_multi"
                           android:persistent="false"
                           android:title="@string/days" />
<ListPreference android:key="action"
                android:persistent="false"
                android:title="@string/action" />
</PreferenceScreen>

res / xml中的那个看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<Preference android:key="time"
            android:persistent="false"
            android:title="@string/time" />
<Preference android:key="days_dialog"
            android:persistent="false"
            android:title="@string/days" />
<ListPreference android:key="action"
                android:persistent="false"
                android:title="@string/action" />
</PreferenceScreen>

如您所见,唯一的区别是列表中的第二个元素,其余的完全相同。有没有更好的方法来处理这个问题,在一个文件中重复使用相同的代码并动态引用剩余的代码,具体取决于Android版本?理想的解决方案看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<Preference android:key="time"
            android:persistent="false"
            android:title="@string/time" />
<Preference source="days.xml" />
<ListPreference android:key="action"
                android:persistent="false"
                android:title="@string/action" />
</PreferenceScreen>

虽然我还有res / xml-v11下的days.xml文件和包含不同文件的res / xml文件。

我在文档中找不到任何相关内容,在StackOverflow上搜索之后。 android是否提供了这样做的方法?或者也许还有其他方法来分解公共代码?

1 个答案:

答案 0 :(得分:1)

我想到的是使用类似<include/>标签的内容。您似乎无法在首选项xmls中使用它,但您可以在部分中创建首选项。因此,您需要在PreferencesActivity中创建这样的首选项(其中R.xml.prefs_days是您的版本特定文件,包含2个版本):

addPreferencesFromResource(R.xml.prefs_time);
addPreferencesFromResource(R.xml.prefs_days);
addPreferencesFromResource(R.xml.prefs_action);

Nested preferences.xml