没有页眉/片段的单页面PreferenceActivity?

61

我正在尝试完成一件我认为相当简单的事情,但是我不知道如何使用PreferenceActivity类和xml preference-header标签来完成它。

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

如果必须点击设置/首选项图标,显示一个单独的标题,然后再点击才能进入实际的设置/首选项界面,这似乎很浪费。

我理解如果您想对偏好进行分类,这可能非常有用,但对于一些简单的东西,这会增加开销并且似乎相当笨拙。

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

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

经过进一步查找,我发现自己在努力以不使用任何弃用函数的方式实现旧方法的目标。

提前感谢,B。


1
我有类似的需求。最终使用了这个解决方案 https://dev59.com/c2gv5IYBdhLWcg3wKtrj#10960720 - krishnakumarp
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);
        }
    }

}  

这段代码在较低的API 11及以下版本上无法运行,因为getFragmentManager()方法是在API 11中添加的。 - Ionut Negru
如果您使用支持库,可以调用getFragmentManager()。 - TheIT
1
@TheIT 你可以使用 getSupportFragmentManager 替代。 - Mars
getSupportFragmentManager的replace()方法需要一个v4.Fragment,而PreferenceFragment(没有支持库版本)与之不兼容。但是可以拉取代码并创建一个v4扩展版本(就像这个gist所示:https://gist.github.com/cbeyls/7475726)。 - lilbyrdie
1
值得注意的是,截至2017年12月,用extends AppCompatActivity替换extends Activity意味着在顶部包含了操作栏。 - James Vickery
显示剩余2条评论

25

我一直在寻找符合这个问题的答案。最终,我从其他几个来源中弄清楚了。对于那些仍然想要答案的人,以下是我使用的方法。(注意-此项目中min和target SDK都设置为15)

  1. 删除PreferenceHeaders,您不需要它们。
  2. 创建单页设置的preference screen。
  3. 创建一个preference activity类(下面是SettingsActivity)。
  4. 创建一个扩展PreferenceFragment的inline类(下面是LocationFragment)。
  5. 在Manifest中定义类。
  6. 启动任务-请参见下面的菜单代码。

显示单个设置屏幕的preference类。

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

返回键终止了SettingsActivity。内置的首选项例程保存了所有更改。我编写的onResume函数执行getSettings(),以更新调用活动(在这种情况下为MainActivity)使用的任何更改的设置。

就是这样。


如果您仍然在Fragment的顶部看到旧标题,请确保删除onBuildHeaders()方法。 - iTurki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接