61

我正在尝试完成一些我认为很容易的事情,但是我对如何使用 PreferenceActivity 类和 xml 首选项标头标记来完成它感到困惑。

当用户点击应用程序设置图标时,我希望他们看到一小部分复选框和列表。我只有一个偏好片段。到目前为止,我可以设置 PreferenceActivity xml 文件(preferences.xml 和首选项片段 xmls)来显示首选项片段的单个标头。当用户选择该标题时,首选项屏幕正是我想要的,但是,我无法找到跳过显示第一个标题屏幕的方法。

必须点击设置/首选项图标,显示单个标题,然后点击以获取实际设置/首选项,这似乎是一种浪费。

我知道如果您想对自己的偏好进行分类,这会非常有帮助,但是对于一些简单的事情,这会增加开销并且看起来相当笨重。

我希望我是清楚的。简而言之,这是我的问题:

使用 PreferenceActivity 类和首选项标题标签来简单地显示没有标题的单个选项屏幕的新首选方法是什么?

在环顾四周之后,看起来我正试图以一种直接的方式做旧方法所做的事情。我试图在不使用任何已弃用的功能的情况下做到这一点。

在此先感谢,B。

4

2 回答 2

90

新的首选方式是显示单个PreferenceFragment作为任何活动的主要内容。它不需要是PreferenceActivity。请参阅 API 演示示例

public class FragmentPreferences extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Display the fragment as the main content.
        getFragmentManager().beginTransaction().replace(android.R.id.content,
                new PrefsFragment()).commit();
    }


    public static class PrefsFragment extends PreferenceFragment {

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            // Load the preferences from an XML resource
            addPreferencesFromResource(R.xml.preferences);
        }
    }

}  
于 2012-10-09T19:16:32.087 回答
25

我正在寻找与这个问题相匹配的答案。最终,我从其他几个来源解决了这个问题。对于那些可能仍然希望回答的人,这对我有用。(注意 - 在这个项目中,最小和目标 SDK 都设置为 15。)

  1. 转储 PreferenceHeaders,您将不需要它们。
  2. 使用单页设置创建首选项屏幕。
  3. 创建一个偏好活动类(SettingsActivity 下面)。
  4. 创建一个扩展 PreferenceFragment 的内联类(下面的 LocationFragment)。
  5. 在 Manifest 中定义类。
  6. 开始任务 - 请参阅下面的菜单代码。

显示单个设置屏幕的首选项类。

public class SettingsActivity extends PreferenceActivity {

    private final static String TAG = "SettingsAcitivity";

    public SettingsActivity() {}

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

    public class LocationFragment extends PreferenceFragment {

        private final static String TAG = "LocationFragment";

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            MyLog.d(TAG, "onCreate");
            addPreferencesFromResource(R.xml.locationsettings);
        }
    }
}

显示设置的代码:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    MyLog.d(TAG, "onOptionsItemSelected");
    switch (item.getItemId()) {
    case R.id.menu_main_help:
        break;
    case R.id.menu_main_about:
        break;
    case R.id.menu_main_settings:
        MyLog.d(TAG, "Settings");
        Intent settingsIntent = new Intent(this, SettingsActivity.class);
        startActivity(settingsIntent);
        break;
    }
    return true;
}

Back 键终止 SettingsActivity。内置的首选项例程保存任何更改。我拥有的 onResume 函数执行 getSettings() 更新调用活动(在本例中为 MainActivity)使用的任何更改设置。

而已。

于 2012-09-14T22:59:11.417 回答