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();
}
}
问题:
- 扩展 PreferencedFragment 的 class 的具体工作是什么?扩展 PreferenceActivity 的 class 的工作是什么?
- android.R.id.content是什么意思?
- 我知道该片段必须与 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 的解释和文档。
这里有一个显示应用偏好的代码示例。第一个代码是扩展 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();
}
}
问题:
- 扩展 PreferencedFragment 的 class 的具体工作是什么?扩展 PreferenceActivity 的 class 的工作是什么?
- android.R.id.content是什么意思?
- 我知道该片段必须与 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 的解释和文档。