我想根据设备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提供的资源》指南,但似乎仍然需要按照上述方式使用替代资源,才能为每种屏幕尺寸和SDK组合创建一个单独的资源目录,并且需要大量代码复制。是否有一个不错的,优雅的解决方案来解决我所缺少的这个问题?
您阅读设置指南了吗?我的应用程序还动态地进行了很多更改,包括1)显示哪些标题/片段,以及2)包含每个片段所包含的内容。对于这两个问题,您都可以使用所描述的不同资源版本,也可以实现代码上的差异。
对于问题1,您可以直接调用loadHeadersFromResource并具有不同的标头资源文件,也可以具有执行类似操作的代码。例如,我的PreferencesActivity为每个prefs部分使用一个单独的PreferenceFragment子类,并在运行时决定要显示哪些片段(标题):
@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,您可以从公共资源文件中的首选项开始,然后在代码中添加有条件的首选项:
@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文件,然后在代码中添加所有首选项。它真的很好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句