我刚刚注意到一个事实,addPreferencesFromResource(int preferencesResId)方法在Android的文档(参考条目)中被标记为弃用。

不幸的是,该方法的描述中没有提供替代方法。

应该使用哪个方法来将preferenceScreen.xml连接到匹配的PreferenceActivity?


当前回答

不要使用异常,只需使用:

if (Build.VERSION.SDK_INT >= 11)

和使用

@SuppressLint("NewApi")

压制警告。

其他回答

该方法的描述中没有提供替代方法,因为首选方法(从API级别11开始)是实例化PreferenceFragment对象,以便从资源文件加载首选项。请参阅这里的示例代码:PreferenceActivity

不要使用异常,只需使用:

if (Build.VERSION.SDK_INT >= 11)

和使用

@SuppressLint("NewApi")

压制警告。

为了给上面的正确答案添加更多信息,在阅读了Android-er的一个例子后,我发现你可以很容易地将你的偏好活动转换为偏好片段。如果你有以下活动:

public class MyPreferenceActivity extends PreferenceActivity
{
    @Override
    protected void onCreate(final Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.my_preference_screen);
    }
}

你唯一需要做的改变是创建一个内部片段类,将addPreferencesFromResources()移动到片段中,并从活动中调用片段,如下所示:

public class MyPreferenceActivity extends PreferenceActivity
{
    @Override
    protected void onCreate(final Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit();
    }

    public static class MyPreferenceFragment extends PreferenceFragment
    {
        @Override
        public void onCreate(final Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.my_preference_screen);
        }
    }
}

从片段中制作更复杂的首选项可能还有其他微妙之处;如果有,我希望有人能在这里记下。

而不是使用PreferenceActivity直接加载首选项,使用AppCompatActivity或等效的加载PreferenceFragmentCompat加载你的首选项。它是支持库(现在是Android Jetpack)的一部分,并提供了API 14的兼容性。

在你的构建中。Gradle,为首选项支持库添加一个依赖项:

dependencies {
    // ...
    implementation "androidx.preference:preference:1.0.0-alpha1"
}

注意:我们假设您已经创建了首选项XML。

为您的活动创建一个新的活动类。如果你使用材质主题,你应该扩展一个AppCompatActivity,但是你可以灵活使用:

public class MyPreferencesActivity extends AppCompatActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_preferences_activity)
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.fragment_container, MyPreferencesFragment())
                    .commitNow()
        }
    }
}

现在是最重要的部分:创建一个片段,从XML加载你的首选项:

public class MyPreferencesFragment extends PreferenceFragmentCompat {

    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource(R.xml.my_preferences_fragment); // Your preferences fragment
    }
}

欲了解更多信息,请阅读PreferenceFragmentCompat的Android开发者文档。

我的方法非常接近加勒特·威尔逊(Garret Wilson)(谢谢,我投票给你了;)

此外,它还向下兼容Android < 3。

我刚刚意识到我的解决方案更接近凯文·雷莫的解决方案。它只是稍微简洁一点(因为它不依赖于“期望”反模式)。

public class MyPreferenceActivity extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
            onCreatePreferenceActivity();
        } else {
            onCreatePreferenceFragment();
        }
    }

    /**
     * Wraps legacy {@link #onCreate(Bundle)} code for Android < 3 (i.e. API lvl
     * < 11).
     */
    @SuppressWarnings("deprecation")
    private void onCreatePreferenceActivity() {
        addPreferencesFromResource(R.xml.preferences);
    }

    /**
     * Wraps {@link #onCreate(Bundle)} code for Android >= 3 (i.e. API lvl >=
     * 11).
     */
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    private void onCreatePreferenceFragment() {
        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, new MyPreferenceFragment ())
                .commit();
    }
}

关于一个“真实的”(但更复杂的)例子,请参阅NusicPreferencesActivity和NusicPreferencesFragment。