Как перейти к пользовательским настройкам с помощью navController? - PullRequest
0 голосов
/ 04 марта 2020

1) Я использую Android Jetpack 2) Я пытаюсь перейти к своему пользовательскому предпочтению TimePreference (расширяет DialogPreference) из моего SettingsFragment (расширяет PreferenceFragmentCompat) с функцией findNavController().navigate(), но я продолжаю получать:

"java.lang.IllegalStateException: Target fragment must implement TargetFragment interface"

, даже если я реализую TargetFragment интерфейс для моего TimePreferenceDialogFragmentCompat (расширяет PreferenceDialogFragmentCompat), что необходимо для TimePreference.

Вот мой код:

Мой TimePreferenceDialogFragmentCompat:

class TimePreferenceDialogFragmentCompat : PreferenceDialogFragmentCompat(), TargetFragment {

    ...

//    companion object {   //for 2nd alternative
//        fun newInstance(key: String?): TimePreferenceDialogFragmentCompat? {
//            val fragment = TimePreferenceDialogFragmentCompat()
//            val bundle = Bundle(1)
//            bundle.putString(ARG_KEY, key)
//            fragment.arguments = bundle
//            return fragment
//        }
//    }

    override fun onBindDialogView(view: View) {
        super.onBindDialogView(view)
        ...
    }

    override fun onDialogClosed(positiveResult: Boolean) {
        ...
    }

    override fun <T : Preference?> findPreference(key: CharSequence): T? {
        return preference as T
    }

}

Мой FilteringSettingsFragment:

class FilteringSettingsFragment : PreferenceFragmentCompat() {

    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.filtering_preferences, rootKey)
    }

    ...

    override fun onDisplayPreferenceDialog(preference: Preference) {
        if (preference is TimePreference) { 
            findNavController().navigate(
                FilteringSettingsFragmentDirections
                    .actionFilteringSettingsFragmentToTimePreferenceDialogFragmentCompat(preference.key))
        } else {
            super.onDisplayPreferenceDialog(preference)
        }
    }
}

Мой navigation.xml:

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/navigation"
    app:startDestination="@id/routineTrackerFragment">

    ...

    <fragment
        android:id="@+id/filteringSettingsFragment"
        android:name="com.example.lifetracker.settings.FilteringSettingsFragment"
        android:label="FilteringSettingsFragment" >
        <action
            android:id="@+id/action_filteringSettingsFragment_to_timePreferenceDialogFragmentCompat"
            app:destination="@id/timePreferenceDialogFragmentCompat" />
    </fragment>
    <dialog
        android:id="@+id/timePreferenceDialogFragmentCompat"
        android:name="com.example.lifetracker.settings.preferences.TimePreferenceDialogFragmentCompat"
        tools:layout="@layout/pref_dialog_time">
        <argument
            android:name="key"
            app:argType="string"
            android:defaultValue="filteringTimePicker" />
    </dialog>
</navigation>

Некоторые альтернативы, которые я использовал:

Мой onDisplayPreferenceDialog вариант 1:

(тоже не работает)

    override fun onDisplayPreferenceDialog(preference: Preference) {
        if (preference is TimePreference) { 
            val bundle = Bundle(1)  
            bundle.putString("key", preference.key)
            findNavController().navigate(R.id.timePreferenceDialogFragmentCompat, bundle) 
        } else {
            super.onDisplayPreferenceDialog(preference)
        }
    }
}

Мой onDisplayPreferenceDialog альтернатива 2:

( альтернатива 2 работает, но fragmentManager удалена, и я не хочу ее использовать)

    override fun onDisplayPreferenceDialog(preference: Preference) {
        var dialogFragment: DialogFragment? = null
        if (preference is TimePreference) {
            dialogFragment = TimePreferenceDialogFragmentCompat.newInstance(preference.getKey())
        }

        if (dialogFragment != null) {
            dialogFragment.setTargetFragment(this, 0)
            this.fragmentManager?.let {
                dialogFragment.show(it, "android.support.v7.preference.PreferenceFragment.DIALOG")
            }
        } else {
            super.onDisplayPreferenceDialog(preference)
        }
    }

Я нашел похожие вопросы но они не дали ответа, который мне нужен:

Я реализовал TimePreference, используя эту статью

Так как мне перейти к моему TimePreference с NavController?

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