Проблема с несколькими экранами в настройках AndroidX - PullRequest
0 голосов
/ 07 марта 2020

Моя цель - создать экран с несколькими предпочтениями, состоящий из основных предпочтений root. xml и вложенных настроек adv_preferences. xml с использованием настроек AndroidX. Пока что приложение состоит только из MainActivity и некоторых фрагментов, таких как фрагмент домашнего экрана, MyRootFragment и AdvPreferencesFragment.

Settings Screenshot

MainActivity не содержит никакого кода, связанного с настройками.

MySettingsFragment.kt :

class MyRootFragment : PreferenceFragmentCompat() { // basic preferences
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.root, rootKey)
    }
}
class AdvPreferencesFragment : PreferenceFragmentCompat() { // advanced preferences
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.adv_preferences, rootKey)
    }
}

root. xml (basi c предпочтений):

<androidx.preference.PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/settings">
    <CheckBoxPreference
        android:defaultValue="true"
        android:key="display_text"
        android:summaryOff="Invisible"
        android:summaryOn="Visible"
        android:title="blabla"/>
    <Preference
        app:title="Advanced Settings"
        app:summary="Test for using multiple screens"
        app:fragment="com.example.app.ui.settings.AdvPreferencesFragment"/>
</androidx.preference.PreferenceScreen>

adv_preferences. xml (расширенные настройки):

<androidx.preference.PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <Preference
        android:key="preference_key"
        android:title="placeholder"
        android:summary="placeholder" />
</androidx.preference.PreferenceScreen>

mobile_navigation. xml :

<fragment
    android:id="@+id/nav_root_preferences"
    android:name="com.example.app.ui.settings.MyRootFragment"
    android:label="@string/menu_preferences"
    tools:layout="@xml/root" />
<fragment
    android:id="@+id/nav_adv_preferences"
    android:name="com.example.app.ui.settings.AdvPreferencesFragment"
    android:label="@string/menu_preferences"
    tools:layout="@xml/adv_preferences" />

Каждый раз, когда я нажимаю Расширенные настройки приложение получит sh со следующим сообщением logcat:

java .lang.IllegalStateException : Fragment AdvPreferencesFragment {...} объявленный целевой фрагмент MySettingsFragment {...}, который не принадлежит этому FragmentManager!

Как это исправить? Кажется, все правильно подключено в обоих фрагментах, xml файлах и графике навигации.

Я уже пытался добавить следующий

supportFragmentManager
    .beginTransaction()
    .replace(R.id.settings, MyRootFragment())
    .commit()

в метод onCreate () в MainActivity ( как в Android Jetpack Preference Guide), но это приводит к следующему cra sh и сообщению (приложение даже не запустится):

java .lang.IllegalArgumentException: Не найдено представление для идентификатора… (com.example.app:id/settings) для фрагмента MySettingsFragment {...}

...