PreferenceFragment class 和 PreferenceActivity class 之间有什么区别以及它们的作用是什么?

What is a difference between PreferenceFragment class and PreferenceActivity class and what they do?

这里有一个显示应用偏好的代码示例。第一个代码是扩展 PreferenceFragment 的 class,第二个代码是扩展 PreferenceActivity.

的 class

首选项屏幕 xml:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <EditTextPreference
        android:key="my_nickname"
        android:title="Enter your nickname"
        android:summary="Here you need to enter your nickname if you want to change it">

    </EditTextPreference>

    <ListPreference
        android:key="color_key"
        android:title="Favorite color"
        android:summary="What is your favorite color to change your color preference"
        android:entries="@array/favorite_colors"
        android:entryValues="@array/colors_numbers"
        android:defaultValue="1"/>



    <CheckBoxPreference
        android:key="notification_key"
        android:title="I want to receive a notification"
        android:summary="If you check this you will receive a notification"
        android:defaultValue="false"/>




</PreferenceScreen>

扩展 PreferenceFragment class:

import android.os.Bundle;
import android.preference.PreferenceFragment;


public class CustomPreferenceWithFragment extends PreferenceFragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
    }
}

扩展偏好Activity class:

    import android.preference.PreferenceActivity;

    import android.os.Bundle;

    public class CustomActivity extends PreferenceActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
         getFragmentManager().beginTransaction()
.replace(android.R.id.content, new CustomPreferenceWithFragment())
.commit();
        }
    }

问题:

  1. 扩展 PreferencedFragment 的 class 的具体工作是什么?扩展 PreferenceActivity 的 class 的工作是什么?
  2. android.R.id.content是什么意思?
  3. 我知道该片段必须与 activity 连接,但为什么此处片段未与 Activity class(扩展 Activity 或 AppCompatActivity) 而不是放在此处的 PreferenceActivity?

两者都或多或少地提供相同的方法来编辑应用程序的内部 SharedPreferences,从 addPreferencesFromResource

的文件加载

我觉得the documentation summarizes best

  • If your app supports versions of Android older than 3.0 (API level 10 and lower), you must build the activity as an extension of the PreferenceActivity class.

  • On Android 3.0 and later, you should instead use a traditional Activity that hosts a PreferenceFragment that displays your app settings. However, you can also use PreferenceActivity to create a two-pane layout for large screens when you have multiple groups of settings.

话虽这么说,Android 已经远远超过了 3.0 API,因此可以安全地将 PreferenceActivity 视为已弃用。即使是 3.0 之前的版本,我相信也有一个带有 PreferenceFragment class.

的支持库

What is a meaning of android.R.id.content

它是屏幕的根元素 - Android: What is android.R.id.content used for?

why here fragment is not connected with Activity class(extends Activity or AppCompatActivity) instead of PreferenceActivity

好吧,PreferenceActivity 确实扩展了 Activity class,因此如果您只是加载一个片段

,则没有真正的理由使用那个特定的片段

在这里我总结了我对这个问题的所有调查: 在阅读 Settings 的文档后,我意识到在我的示例中,我可以将 PreferenceActivity 替换为常规 Activity 并且一切正常。 实际上,Android 文档说,如果我正在为 Android 3.0(API 级别 11)及更高版本开发,我应该使用 PreferenceFragment,而 PreferenceActivity 用于较低的 API 比11。 在我的例子中,我使用了 PreferenceFragment,但我将片段添加到 Activity 和 class,它扩展了 PreferenceActivity,尽管我应该使用基本的 Activity。 这是我将片段添加到 Activity:

的新代码
import android.app.Activity;
//import android.preference.PreferenceActivity;

import android.os.Bundle;

public class CustomActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, new CustomPreferenceWithFragment())
                .commit();
    }
}

感谢 cricket_007 的解释和文档。