Использование заголовков предпочтений в PreferenceFragmentCompat в библиотеке поддержки v7 - Ошибка надувания заголовков предпочтений класса (не найден) - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть один 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 и обрабатывать страницу настроек так же, как фрагмент?

На всякий случай, если я не достаточно ясно, вотизображение того, что я пытаюсь сделать (всего несколько категорий предпочтений с помощью навигационного ящика) : Just a few preferences categories with a Navigation Drawer

И вот как это должно выглядеть после вводакатегория (PreferenceScreen): And this is how it should look after you enter a category

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...