【问题标题】:What is a difference between PreferenceFragment class and PreferenceActivity class and what they do?PreferenceFragment 类和 PreferenceActivity 类有什么区别,它们的作用是什么?
【发布时间】:2019-01-12 07:21:46
【问题描述】:

这里有一个显示应用偏好的代码示例。第一个代码是扩展 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. 我知道 Fragment 必须与 Activity 连接,但为什么这里的 Fragment 没有与 Activity 类(扩展 Activity 或 AppCompatActivity)而不是放置在这里的 PreferenceActivity 连接?

【问题讨论】:

  • 我认为您不需要 PreferenceActivity 来加载 PreferenceFragment

标签: android preferenceactivity android-sharedpreferences preferencefragment


【解决方案1】:

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

我觉得the documentation summarizes best

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

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

话虽如此,Android 的发展已经远远超出 3.0 API,因此可以安全地将 PreferenceActivity 视为已弃用。即使是 pre-3.0,我相信也有一个带有 PreferenceFragment 类的支持库。

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

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

为什么这里的 Fragment 没有连接到 Activity 类(扩展 Activity 或 AppCompatActivity)而不是 PreferenceActivity

好吧,PreferenceActivity 确实扩展了 Activity 类,所以如果你只加载一个 Fragment 就没有真正的理由使用那个特定的类

【讨论】:

  • 你能描述一下我的代码中的 PreferenceFragment 和 PreferenceActivity 到底是做什么的吗?
  • 所有安卓应用都需要运行Activity。你扩展哪种类型并不重要,因为你只是在加载一个片段。除了加载 xml 文件之外,我看不到您的 Fragment 正在做什么
  • 关于你的XML文件的作用,请参考链接文档
  • 好的,如果我理解扩展 PreferenceFragment 加载 XML 的类和扩展 PreferenceActivity 显示片段的第二个类或什么?
  • 两种类型的类都可以加载 XML 文件。事实上,该文件是首选项工作所必需的。如上所述和文档中提到的,首选 Fragment 类。任何 Fragment 都可以加载到 Activity 中,与 Preferences 无关。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-08-29
    • 2020-03-21
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 2013-04-18
    • 2021-08-10
    • 1970-01-01
    • 2015-11-18
    相关资源
    最近更新 更多