Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android上创建多个preferences.xml文件时,如何重用代码?_Android_Android Xml - Fatal编程技术网

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

在Android上创建多个preferences.xml文件时,如何重用代码?,android,android-xml,Android,Android Xml,我想根据设备SDK和屏幕大小在我的应用程序中显示不同的首选项选项,但某些首选项将显示在所有设备上。我可以通过为每个可能的设备创建一个完整的preferences.xml文件来实现这一点,如下所示: xml/preferences.xml: <PreferenceScreen> <!-- Preference 1 (all devices) --> <!-- Preference 2 (all devices) --> </Preferen

我想根据设备SDK和屏幕大小在我的应用程序中显示不同的首选项选项,但某些首选项将显示在所有设备上。我可以通过为每个可能的设备创建一个完整的preferences.xml文件来实现这一点,如下所示:

xml/preferences.xml

<PreferenceScreen>
    <!-- Preference 1 (all devices) -->
    <!-- Preference 2 (all devices) -->
</PreferenceScreen>
<PreferenceScreen>
    <!-- Preference 1 (all devices) -->
    <!-- Preference 2 (all devices) -->
    <!-- Preference 3 (SDK 21 only) -->
</PreferenceScreen>
但考虑到屏幕大小和SDK的可能组合数量,这将很快变得非常笨拙。我真正想做的是在所有设备上使用相同的基本首选项列表,并动态混合特定于特定屏幕大小和SDK的其他首选项。我已经阅读了Android指南,但是似乎按照上面描述的方式使用替代资源仍然需要为每个屏幕大小和SDK组合创建单独的资源目录,并且需要大量代码重复。有没有一个好的、优雅的方法来解决我所缺少的这个问题?

你读过这篇文章了吗?我的应用程序也有很多动态变化,1)显示哪些标题/片段,2)每个片段包含哪些前缀。对于这两个问题,您可以使用不同的资源版本,正如您所描述的,或者您可以实现代码中的差异

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

实际上,我在代码中添加了所有pref,公共和条件。然而,我没有找到从头创建PreferenceScreen的方法,所以我实际上有一个从参考资料加载的空XML文件,然后在代码中添加所有首选项。它工作得非常好

@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) {
        }
    }
}
@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);
    }
}