在Android 4.0的ApiDemos中尝试不同的首选项 Activity 时,我在代码中看到例如PreferencesFromCode.java中不赞成使用某些方法。

所以我的问题是:如果我使用PreferenceFragment,它将适用于所有版本还是仅适用于3.0或4.0及更高版本?

如果是这样,那我应该使用在2.2和2.3上都可以使用的东西吗?

最佳答案

PreferenceFragment在2.2和2.3(仅API级别11及更高版本)上不起作用。如果要提供最佳用户体验并仍支持较旧的Android版本,则此处的最佳实践似乎是实现两个PreferenceActivity类,并在运行时确定要调用哪个类。但是,此方法仍然包括调用已弃用的API,但是您不能避免这种情况。

例如,您有一个preference_headers.xml:

<preference-headers xmlns:android="http://schemas.android.com/apk/res/android" >
    <header android:fragment="your.package.PrefsFragment"
        android:title="...">
        <extra android:name="resource" android:value="preferences" />
    </header>
</preference-headers>

和一个标准的preferences.xml(自较低的API级别以来并没有太大变化):
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="...">
    ...
</PreferenceScreen>

然后,您需要实现PreferenceFragment:
public static class PrefsFragment extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
    }
}

最后,对于支持或不支持PreferenceActivity的API级别,您需要两种实现PreferenceFragments:
public class PreferencesActivity extends PreferenceActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
        addPreferencesFromResource(R.xml.other);
    }
}

和:
public class OtherPreferencesActivity extends PreferenceActivity {
    @Override
    public void onBuildHeaders(List<Header> target) {
        loadHeadersFromResource(R.xml.preference_headers, target);
    }
}

在要向用户显示首选项屏幕时,您决定从哪个屏幕开始:
if (Build.VERSION.SDK_INT < 11) {
    startActivity(new Intent(this, PreferencesActivity.class));
} else {
    startActivity(new Intent(this, OtherPreferencesActivity.class));
}

因此,基本上,每个片段都有一个xml文件,您为

关于android - PreferenceActivity Android 4.0及更低版本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10186697/

10-11 10:21