在PreferenceFragmentCompat中动态扩充首选项

时间:2015-12-01 09:27:50

标签: android android-support-library preferencefragment

我正在使用支持库中的PreferenceFragmentCompat(preference-v14:23.0.1 - 虽然我也尝试过23.1.1)。我在XML文件中拥有所有我的首选项设置,并且正常地在onCreatePreferences中对它们进行充气:

du

首次显示片段时,我想隐藏一些首选项,直到我收到网络回调的结果,我可能希望再次显示这些偏好。

我尝试将各种偏好设置的可见性设置为false,希望稍后我可以再将它们设置为可见,但它看起来像:

 @Override
 public void onCreatePreferences(final Bundle bundle, final String s) {
        addPreferencesFromResource(R.xml.fragment_settings);

从列表中有效地删除首选项,当我稍后再次尝试在Preference上查找时,它将返回null。

作为替代方案,我创建了一个创建首选项的方法,然后我可以将其添加到适配器中的相关屏幕/位置:

Preference preference = findPreference(getString(R.string.settings_key_value));
preference.setVisible(false);

然后我按如下方式使用它:

private Preference createPreference(@StringRes int title, @StringRes int key, @StringRes int summary, int order) {
    final Preference preference = new Preference(getContext());
    preference.setTitle(title);
    preference.setKey(getString(key));
    if (summary > 0) {
        preference.setSummary(summary);
    }
    preference.setOrder(order);
    return preference;
}

但是,当我这样做时,首选项标题的字体大小不正确(并且可能是首选项中的其他样式)。这可能是因为未设置首选项的属性集,并且它没有从我的应用主题继承首选项样式。有没有办法从xml正确地扩展个人首选项,以便它具有正确的样式并将其添加到我的首选项列表或修改createPreference方法,以便它将使用正确的样式?

我的AppTheme定义了以下相关属性:

final PreferenceCategory category = (PreferenceCategory) findPreference(getString(R.string.settings_category_name));
preference = createPreference(R.string.pref_title, R.string.settings_pref_key, R.string.pref_summary, 0);
category.addPreference(preference);

2 个答案:

答案 0 :(得分:1)

使用addPreferencesFromResource为您创建动态属性的主题上下文。获取并保持以下方式:

Context styledContext;

@Override
public void onCreatePreferences(Bundle bundle, String s) {
    addPreferencesFromResource(R.xml.preferences);
    styledContext=getPreferenceScreen().getContext();
    ....
}

如果您隐藏(删除)某些属性并需要从XML支持它们,请使用以下代码行:

   setPreferenceScreen(
        getPreferenceManager().inflateFromResource(
                  styledContext,
                  R.xml.preferences,
                  null)
        );

答案 1 :(得分:0)

您可以在字段中保留Preference的引用,稍后再setVisible(true)

setVisible(false)从层次结构中删除Preference,但setVisible(true)会将其重新添加到层次结构中。