android - 在 Android 上创建多个 preferences.xml 文件时如何重用代码?

标签 android android-xml

我想根据设备 SDK 和屏幕尺寸在我的应用中显示不同的偏好选项,但某些偏好会显示在所有设备上。我可以通过为每个可能的设备创建一个完整的 preferences.xml 文件来完成此操作,如下所示:

xml/preferences.xml:

<PreferenceScreen>
    <!-- Preference 1 (all devices) -->
    <!-- Preference 2 (all devices) -->
</PreferenceScreen>

xml-v21/preferences.xml:

<PreferenceScreen>
    <!-- Preference 1 (all devices) -->
    <!-- Preference 2 (all devices) -->
    <!-- Preference 3 (SDK 21 only) -->
</PreferenceScreen>

但考虑到屏幕尺寸和 SDK 的可能组合数量,这很快就会变得笨拙。我真正想做的是在所有设备上使用相同的基本首选项列表,并动态混合特定于特定屏幕尺寸和 SDK 的其他首选项。我经历了 Android Providing Resources指南,但似乎以那里描述的方式使用替代资源仍然需要我为每个屏幕尺寸和 SDK 组合创建一个单独的资源目录,并且需要大量代码重复。对于我缺少的这个问题,是否有一个很好的、优雅的解决方案?

最佳答案

你读过Settings guide吗? ?我的应用程序也有很多动态变化,包括 1) 要显示的 header /fragment ,以及 2) 每个 fragment 包含的首选项。对于这两个问题,您可以使用不同的资源版本,如您所描述的,或者您可以实现代码中的差异。

对于问题 #1,您可以直接调用 loadHeadersFromResource 并使用不同的 header 资源文件,或者您可以使用执行类似操作的代码。例如,我的 PreferencesActivity 为每个 prefs 部分使用一个单独的 PreferenceFragment 子类,并在运行时决定显示哪些 fragment (标题):

@Override
public void onBuildHeaders(List<Header> targets) {
    // Build a list of PreferenceFragment class objects to show now
    List<Class<? extends PreferenceFragment>> fragmentClasses = ...;

    // Create a Header for each fragment to return to Android
    for (Class<? extends PreferenceFragment> fragmentClass: fragmentClasses) {
        try {
            PreferenceFragment fragment = fragmentClass.newInstance();
            Header header = new Header();
            header.fragment = fragmentClass.getName();
            header.titleRes = fragment.getTitleId();
            targets.add(header);
            this.headers = targets;
        } catch (Exception e) {
        }
    }
}

对于问题 #2,您可以从公共(public)资源文件中的首选项开始,然后在代码中添加条件:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Load common prefs from an XML resource
    addPreferencesFromResource(R.xml.preferences);

    // Add conditional prefs in code
    PreferenceScreen prefScreen = getPreferenceScreen();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Preference pref = ...; // create condition pref
        prefScreen.addPreference(pref);
    }
}

我实际上在代码中添加了所有偏好,常见的和有条件的。但是,我没有看到从头开始创建 PreferenceScreen 的方法,所以我实际上有一个从资源加载的空 XML 文件,然后在代码中添加所有首选项。效果非常好。

关于android - 在 Android 上创建多个 preferences.xml 文件时如何重用代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27884040/

相关文章:

android - 如何更改应用程序中使用的默认键盘的背景颜色?

android - 如何在android中配置应用程序设置?

android - 为什么我的 Android 应用程序名称与启动器 Activity 名称相同?

java - 在 Java 文件而不是 xml 中定义颜色常量

android - 如何以编程方式增加 IntentFilter 的优先级

android - 我无法在 monodroid 中发布应用程序

java - 自定义控件内的 Android 微调器 - OnItemSelectedListener 不会触发

android - 如何在 Android 中显示 JSONObject?

java - Firebase实时数据库: what is the prefeable way to organize AddValueListener part?

android - 以下类无法实例化 : - com. google.android.gms.plus.PlusOneButton