Android Кнопка возврата компонента навигации не работает - PullRequest
1 голос
/ 21 января 2020

Я использую компонент навигации в android, где я изначально установил 6 фрагментов. Проблема в том, когда я добавил новый фрагмент (ProfileFragment).

Когда я перемещаюсь к этому новому фрагменту от места назначения, нажатие кнопки «назад» не отключает текущий фрагмент. Вместо этого он просто остается на фрагменте, в котором я нахожусь - кнопка возврата ничего не делает.

Вот моя навигация. xml:

<?xml version="1.0" encoding="utf-8"?>
<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/dashboard_navigation"
    app:startDestination="@id/dashboardFragment"
    >

                <fragment
                    android:id="@+id/dashboardFragment"
                    android:name="com.devssocial.localodge.ui.dashboard.ui.DashboardFragment"
                    android:label="DashboardFragment"
                    >
                                <action
                                    android:id="@+id/action_dashboardFragment_to_newPostFragment"
                                    app:destination="@id/newPostFragment"
                                    app:enterAnim="@anim/slide_in_up"
                                    app:exitAnim="@anim/slide_out_down"
                                    app:popEnterAnim="@anim/slide_in_up"
                                    app:popExitAnim="@anim/slide_out_down"
                                    />
                                <action
                                    android:id="@+id/action_dashboardFragment_to_notificationsFragment"
                                    app:destination="@id/notificationsFragment"
                                    app:enterAnim="@anim/slide_in_up"
                                    app:exitAnim="@anim/slide_out_down"
                                    app:popEnterAnim="@anim/slide_in_up"
                                    app:popExitAnim="@anim/slide_out_down"
                                    />
                                <action
                                    android:id="@+id/action_dashboardFragment_to_mediaViewer"
                                    app:destination="@id/mediaViewer"
                                    app:enterAnim="@anim/slide_in_up"
                                    app:exitAnim="@anim/slide_out_down"
                                    app:popEnterAnim="@anim/slide_in_up"
                                    app:popExitAnim="@anim/slide_out_down"
                                    />
                                <action
                                    android:id="@+id/action_dashboardFragment_to_postDetailFragment"
                                    app:destination="@id/postDetailFragment"
                                    app:enterAnim="@anim/slide_in_up"
                                    app:exitAnim="@anim/slide_out_down"
                                    app:popEnterAnim="@anim/slide_in_up"
                                    app:popExitAnim="@anim/slide_out_down"
                                    />

                            ====================== HERE'S THE PROFILE ACTION ====================                                
                                <action
                                    android:id="@+id/action_dashboardFragment_to_profileFragment"
                                    app:destination="@id/profileFragment"
                                    app:enterAnim="@anim/slide_in_up"
                                    app:exitAnim="@anim/slide_out_down"
                                    app:popEnterAnim="@anim/slide_in_up"
                                    app:popExitAnim="@anim/slide_out_down"
                                    />
                            =====================================================================                                

                </fragment>



                <fragment
                    android:id="@+id/profileFragment"
                    android:name="com.devssocial.localodge.ui.profile.ui.ProfileFragment"
                    android:label="fragment_profile"
                    tools:layout="@layout/fragment_profile"
                    />
</navigation>

enter image description here

На изображении выше выделенная стрелка (слева) - это навигационное действие, с которым у меня возникают проблемы.

В моем Фрагменте код, я перемещаюсь следующим образом:

findNavController().navigate(R.id.action_dashboardFragment_to_profileFragment)

Другие навигационные действия работают, как предполагалось. Но по какой-то причине этот недавно добавленный фрагмент не работает должным образом.

Нет журналов, показывающих, когда я перехожу к ProfileFragment и когда я нажимаю кнопку возврата.

Я что-то упустил? или что-то не так с моими конфигурациями действий / фрагментов?

РЕДАКТИРОВАТЬ: Я ничего не делаю в ProfileFragment . Вот код для этого:

class ProfileFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_profile, container, false)
    }


}

И моя активность xml, содержащая хост nav:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <fragment
            android:id="@+id/dashboard_navigation"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:navGraph="@navigation/dashboard_navigation"
            app:defaultNavHost="true"/>

</FrameLayout>

Ответы [ 3 ]

2 голосов
/ 29 января 2020

Эта проблема возникла у меня при использовании MutableLiveData для навигации между фрагментами и при наблюдении объекта живых данных более чем на одном фрагменте.

Я решил эту проблему, наблюдая объект данных в реальном времени только один раз или используя SingleLiveEvent вместо MutableLiveData. Так что, если у вас здесь тот же сценарий, попробуйте наблюдать объект данных в реальном времени только один раз или используйте SingleLiveEvent.

1 голос
/ 09 апреля 2020

Если вы используете Moxy или похожие библиотеки, проверьте стратегию при переходе от одного фрагмента к второму. У меня была такая же проблема, когда стратегия была AddToEndSingleStrategy. Вам нужно изменить его на SkipStrategy.

interface ZonesListView : MvpView {

    @StateStrategyType(SkipStrategy::class)
    fun navigateToChannelsList(zoneId: String, zoneName: String)
}
0 голосов
/ 21 января 2020

Вы можете использовать это для Activity

onBackPressedDispatcher.addCallback(
                this,
                object : OnBackPressedCallback(true) {
                    override fun handleOnBackPressed() {
                        onBackPressed()
                        // if you want onBackPressed() to be called as normal afterwards

                    }
                }
        )

Для fragment, потребуется requireActivity() вместе с обратным вызовом

requireActivity().onBackPressedDispatcher.addCallback(
                    this,
                    object : OnBackPressedCallback(true) {
                        override fun handleOnBackPressed() {
                            requireActivity().onBackPressed()
                            // if you want onBackPressed() to be called as normal afterwards

                        }
                    }
            )

Если у вас есть Button или что-то еще для выполнения действия, тогда вы можете использовать

this.findNavController().popBackStack()
...