Использование заголовков настроек в PreferenceFragmentCompat в библиотеке поддержки v7 - Ошибка надувания заголовков предпочтений класса (не найден)
У меня есть такой MainActivity
с навигационным ящиком и несколькими фрагментами. Я пытаюсь добавить страницу настроек в свое приложение с заголовками настроек (потому что у меня много настроек).
Я хочу, чтобы страница настроек находилась в той же активности, что и MainActivity
потому что я хочу сохранить тот же блок навигации и просто потому, что не могу найти причин для создания совершенно нового вида деятельности только для предпочтений.
Это мое SettingsFragment
код:
import android.annotation.TargetApi;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.preference.ListPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceFragmentCompat;
public class SettingsFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle bundle, String s) {
addPreferencesFromResource(R.xml.pref_headers);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class GeneralPreferenceFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle bundle, String s) {
addPreferencesFromResource(R.xml.pref_general);
setHasOptionsMenu(true);
// Bind the summaries of EditText/List/Dialog/Ringtone preferences
// to their values. When their values change, their summaries are
// updated to reflect the new value, per the Android Design
// guidelines.
bindPreferenceSummaryToValue(findPreference("example_text"));
bindPreferenceSummaryToValue(findPreference("example_list"));
}
}
private static void bindPreferenceSummaryToValue(Preference preference) {
// Set the listener to watch for value changes.
preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);
// Trigger the listener immediately with the preference's
// current value.
sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
android.support.v7.preference.PreferenceManager
.getDefaultSharedPreferences(preference.getContext())
.getString(preference.getKey(), ""));
}
private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object value) {
String stringValue = value.toString();
if (preference instanceof ListPreference) {
// For list preferences, look up the correct display value in
// the preference's 'entries' list.
ListPreference listPreference = (ListPreference) preference;
int index = listPreference.findIndexOfValue(stringValue);
// Set the summary to reflect the new value.
preference.setSummary(
index >= 0
? listPreference.getEntries()[index]
: null);
} else {
// For all other preferences, set the summary to the value's
// simple string representation.
preference.setSummary(stringValue);
}
return true;
}
};
}
pref_headers.xml
:
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
<!-- These settings headers are only used on tablets. -->
<header
android:fragment="com.morha.cumtaalerts.fragment.SettingsFragment$GeneralPreferenceFragment"
android:icon="@drawable/ic_info_black_24dp"
android:title="@string/pref_header_general" />
</preference-headers>
Примечание. В pref_headers.xml есть только один заголовок, чтобы сделать вопрос короче и понятнее.
Ошибка, которую я получаю при переходе на этот фрагмент:
android.view.InflateException: Binary XML file line #1: Error inflating class (not found)preference-headers
Я много читал в Интернете, но я не нашел никого, кто имел такую же проблему. Я обнаружил, что я должен использовать loadHeadersFromResource
вместо addPreferencesFromResource
но проблема в том, что loadHeadersFromResource
не существует в PreferenceFragmentCompat
,
Насколько я понял, PreferenceFragmentCompat
не знает preference-headers
тег.
Итак, мой вопрос, я делаю что-то не так? Если нет, есть ли способ реализовать то, что я пытаюсь сделать?
Возможно, я должен использовать AppCompatPreferenceActivity
? Если это так, есть ли способ сохранить тот же ящик навигации от MainActivity
и обрабатывать страницу настроек так же, как фрагмент?
На случай, если я не был достаточно ясен, вот изображение того, что я пытаюсь сделать (всего несколько категорий предпочтений с помощью Навигационного ящика):
И вот как это должно выглядеть после ввода категории (PreferenceScreen):
Спасибо!