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
?