使用支持(v21)工具栏创建偏好设置屏幕

116

我在使用支持库中的新Material Design工具栏时遇到了问题,并且出现在Preference屏幕上。

我的settings.xml文件内容如下:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory
        android:title="@string/AddingItems"
        android:key="pref_key_storage_settings">

        <ListPreference
            android:key="pref_key_new_items"
            android:title="@string/LocationOfNewItems"
            android:summary="@string/LocationOfNewItemsSummary"
            android:entries="@array/new_items_entry"
            android:entryValues="@array/new_item_entry_value"
            android:defaultValue="1"/>

    </PreferenceCategory>
</PreferenceScreen>

这些字符串在其他地方被定义。


这个答案提供了一个完美的Support Library解决方案。 - harishannam
13个回答

1

我想继续James Cross的标记解决方案,因为在那之后有一个问题,即如何关闭仅活动嵌套屏幕(PreferenceFragment),以避免关闭SettingsActivity。

实际上,它可以在所有嵌套屏幕上工作(所以我不理解Gábor的解决方案,我试过但没有成功,它可以一直工作直到某个点,但是有多个工具栏的混乱),因为当用户点击子首选项屏幕时,只更改片段(请参见<FrameLayout android:id="@+id/content_frame" .../>),而不是始终处于活动和可见状态的工具栏,但应该实现自定义行为来相应地关闭每个片段。

在扩展ActionBarActivity的主类SettingsActivity中,应实现以下方法。请注意,私有setupActionBar()从onCreate()调用。

private void setupActionBar() {
    Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
    //Toolbar will now take on default Action Bar characteristics
    setSupportActionBar(toolbar);
    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        onBackPressed();
        return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0) {
        getFragmentManager().popBackStackImmediate();
        //If the last fragment was removed then reset the title of main
        // fragment (if so the previous popBackStack made entries = 0).
        if (getFragmentManager().getBackStackEntryCount() == 0) {
            getSupportActionBar()
                .setTitle(R.string.action_settings_title);
        }
    } else {
        super.onBackPressed();
    }
}

对于所选的嵌套屏幕标题,您应该获取工具栏的引用并使用toolbar.setTitle(R.string.pref_title_general);设置适当的标题(例如)。
在所有PreferenceFragment中实现getSupportActionBar()不必要的,因为每次提交时仅更改片段的视图,而不是工具栏; 没有必要创建一个假的ToolbarPreference类以添加到每个preference.xml中(请参见Gábor的答案)。

1

@TimRae 我不确定我已经测试了你所说的内容。请解释一下你的意思。你具体尝试使用的场景是什么? - android developer
我从未使用过这样的东西。阅读文档:http://developer.android.com/reference/android/preference/PreferenceScreen.html,我发现它可以帮助在屏幕之间进行切换。你说我应该添加它吗?我会去看看的。谢谢。另外,请下次使用Github来处理此类事情(请求和问题)。 - android developer
是的,当您在单个屏幕上有太多首选项时,它非常有用... 在此线程中已经有几个人提到了嵌套屏幕,因此我认为这里是适当的评论位置。 - Tim Rae
谢谢你的尝试,但是不行。请将你的设置文件更改为这个 - Tim Rae
@TimRae 无法确认有任何问题(除了可能是工具栏消失并且在更改方向时离开此屏幕的情况)。在真实设备(SGS3)上测试,使用Lollipop 5.1.1。到底哪里出了问题?请在Github上写下来并告诉我。此外,我认为您可以通过在单击它们时替换当前首选项并存储和恢复当前状态来克服这个问题。 - android developer
显示剩余6条评论

1

今天(2015年11月18日)这对我仍然是一个问题。我尝试了此线程中的所有解决方案,但有两个主要问题我无法解决:

  • 嵌套的首选项屏幕没有工具栏
  • 在Lollipop之前的设备上,首选项没有Material外观

所以最终我创建了一个带有更复杂解决方案的库。基本上,如果我们使用Lollipop之前的设备,我必须在内部应用样式到首选项,并且我还使用自定义片段处理嵌套屏幕(利用PreferenceScreen key恢复所有嵌套层次结构)。

该库是:https://github.com/ferrannp/material-preferences

如果您有兴趣查看源代码(过长不便于在此处发布),这基本上是其核心:https://github.com/ferrannp/material-preferences/blob/master/library/src/main/java/com/fnp/materialpreferences/PreferenceFragment.java


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