2015-12-01 3 views
0

Я использую PreferenceFragmentCompat из библиотеки поддержки (preference-v14: 23.0.1 - хотя я также пробовал ее с 23.1.1). У меня есть все мои настройки предпочтений в файле XML и надувать их в onCreatePreferences как обычно:Динамические изменения настроек PreferenceFragmentCompat

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

Когда фрагмент первым показан, я хочу, чтобы скрыть некоторые предпочтения, пока я не получу результаты сетевого вызова туда, где Возможно, я захочу снова показать эти предпочтения.

Я попытался установить видимость на различных предпочтениях ложны в надежде, что я бы тогда быть в состоянии установить их снова видны позже, но это выглядит следующим образом:

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

Эффективно удаляет предпочтение из списка и когда Я снова попробую найти в Preference, затем возвращает null.

В качестве альтернативы, я тогда создал метод, чтобы создать предпочтение, которое я мог бы добавить к соответствующему экран/положение в адаптере:

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

Затем я использую его следующим образом:

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

Однако, когда я делаю это, размер шрифта заголовка предпочтения неверен (и, возможно, другие стили в пределах Предпочтения). Вероятно, это связано с тем, что набор атрибутов предпочтения не задан, и он не наследует стиль предпочтений из моей темы приложения. Есть ли способ правильно надуть индивидуальные предпочтения из xml, чтобы иметь правильный стиль и добавить его в мой список предпочтений или изменить метод createPreference, чтобы он использовал правильный стиль?

Мой AppTheme определяется с помощью следующего соответствующего атрибута:

<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item> 
+0

На данный момент я исправил это, заменив SettingsFragment на новый, когда я получаю новую информацию из сети - но, очевидно, это не идеально - он не использует список предпочтений, находящийся в recyclerview и анимировать новые предпочтения соответствующим образом. –

ответ

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) 
     ); 
+0

Как бы это было лучше, чем просто воссоздать фрагмент с нуля? Я все еще не получаю приятные анимации RecyclerView, чтобы показать, что элементы были добавлены или удалены? –

+0

Сначала вас спрашивают о неправильном дизайне. Я указываю вам, как создавать динамические элементы с правильным стилем. –

0

Вы можете просто сохранить ссылку до Preference в поле и setVisible(true) позже.

setVisible(false) удаляет Preference из иерархии, но setVisible(true) повторно добавит его в иерархию.

+0

Это работает для одного или двух предпочтений, но если я обновляю видимость 4 или 5, то получаю следующие ошибки: Причиняется: java.lang.IndexOutOfBoundsException: Недопустимый индекс 13, размер 13 в файле android.support.v7.preference. PreferenceGroupAdapter.onPreferenceVisibilityChange (PreferenceGroupAdapter.java:241 –

+0

@BarryIrvine Похож на ошибку, о которой следует сообщать на http://b.android.com –