PreferenceFragment类和PreferenceActivity类之间的区别是什么?

时间:2018-08-04 19:22:03

标签: android preferenceactivity android-sharedpreferences preferencefragment

在这里,我有一个显示应用程序首选项的代码示例。第一个代码是扩展PreferenceFragment的类,第二个代码是扩展PreferenceActivity的类。

PreferenceScreen 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类:

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);
    }
}

扩展PreferenceActivity类:

    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的类的工作是什么?扩展PreferenceActivity的类的工作是什么?
  2. android.R.id.content是什么意思?
  3. 我知道片段必须与活动关联,但是为什么这里的片段不与Activity类(扩展Activity或AppCompatActivity)而不是与此处放置的PreferenceActivity关联?

2 个答案:

答案 0 :(得分:1)

两者都或多或少提供了相同的方法来编辑应用程序的内部SharedPreferences,这些应用程序是使用addPreferencesFromResource从文件加载的

我感觉the documentation summarizes best

  
      
  • 如果您的应用支持的Android版本低于3.0(API级别10和更低),则必须将活动构建为PreferenceActivity类的扩展。

  •   
  • 在Android 3.0及更高版本上,您应该改用传统的Activity,该Activity承载显示您的应用设置的PreferenceFragment。但是,当您有多组设置时,也可以使用PreferenceActivity为大屏幕创建两窗格布局。

  •   

话虽这么说,Android已经发展到远远超过3.0 API,所以可以将PreferenceActivity视为已弃用。甚至在3.0之前的版本中,我相信都有一个带有PreferenceFragment类的支持库。

  

android.R.id.content是什么意思

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

  

为什么这里的片段未与Activity类(扩展Activity或AppCompatActivity)而不是PreferenceActivity连接

好吧,PreferenceActivity确实扩展了Activity类,因此,如果仅加载片段,则没有真正的理由使用该特定类。

答案 1 :(得分:0)

在这里,我总结了对这个问题的所有调查: 阅读Settings的文档后,我意识到在示例中,我可以将PreferenceActivity替换为常规Activity,并且一切正常。 实际上,Android文档说,如果我正在为Android 3.0(API级别11)及更高版本开发,并且PreferenceActivity用于低于11的API,则应该使用PreferenceFragment。 在本例中,我应按原样使用PreferenceFragment,但我将片段添加到Activity并扩展了PreferenceActivity的类,尽管我应该使用基本的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的解释和文档。