BottomSheetDialogFragment нажмите, чтобы открыть другой BottomSheetDialogFragment android

У меня есть ChatRoomActivity с NavHostFragment. Фрагмент по умолчанию — ConversatioFragment, который может открыть MessageChoicesFragment, который является BottomSheetDialogFragment. Там у нас есть 3 варианта 1) Копировать сообщение 2) Прочитать 3) Удалить сообщение.

Если я нажму 2) Читать из (где я могу увидеть, какие получатели прочитали сообщение), я хочу закрыть MessageChoicesFragment и открыть MessageReadDialogFragment BottomSheetFragment.

Итак, желаемый поток, который я хочу, - это
ChatRoomActivity {
ConversationFragment --onClick--> MessageChoicesFragment --onClick-->
MessageReadDialogFragment
}

С более подробной информацией. NavGraph ChatRoomActivity выглядит следующим образом:

      <?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/chat_room_nav_menu"
    app:startDestination="@id/conversationFragment">

    <fragment
        android:id="@+id/conversationFragment"
        android:name="com.example.ui.fragments.chatroom.ConversationFragment"
        android:label="conversation_fragment"
        tools:layout="@layout/conversation_fragment" >
        <action
            android:id="@+id/action_conversationFragment_to_messageChoicesFragment"
            app:destination="@id/messageChoicesFragment" />
        <action
            android:id="@+id/action_conversationFragment_to_messageReadDialogFragment"
            app:destination="@id/messageReadDialogFragment" />
    </fragment>
    <dialog
        android:id="@+id/messageReadDialogFragment"
        android:name="com.example.ui.dialogs.chatroom.MessageReadDialogFragment"
        android:label="MessageReadDialogFragment"
        tools:layout="@layout/message_read_panel"/>
    <dialog
        android:id="@+id/messageChoicesFragment"
        android:name="com.example.ui.dialogs.chatroom.MessageChoicesFragment"
        android:label="fragment_message_choices"
        tools:layout="@layout/fragment_message_choices" />
</navigation>

Когда пользователь долго нажимает на сообщение, я открываю MessageChoicesFragment

      override fun onRowLongClicked() {     
   findNavController().navigate(R.id.action_conversationFragment_to_messageChoicesFragment)
}

MessageChoicesFragment имеет 3 кнопки. Когда я нажимаю кнопку «Читать из», я хочу закрыть MessageChoicesFragment и открыть MessageReadDialogFragment

      binding.readFromLayout.setOnClickListener {     
 findNavController().navigate(R.id.action_conversationFragment_to_messageReadDialogFragment)
 dialog?.dismiss()
}

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

      java.lang.IllegalArgumentException: Navigation action/destination com.example:id/action_conversationFragment_to_messageReadDialogFragment cannot be found from the current destination Destination(com.example:id/messageChoicesFragment) label=fragment_message_choices

Итак, как я могу это решить?

1 ответ

Или вы можете использовать функцию делегирования. Вызовите функцию openReadFromBottomSHeet() в вашем bottomSheetDialogFragment. И это вызовет вашу функцию в ConversatioFragment. Затем закройте предыдущий нижний лист и откройте новый для опции ReadFrom.

      ConversationFragment{
     
     lateinit var messageChoicesDialogFragmentObj:     MessageChoicesDialogFragment()

     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        messageChoicesDialogFragmentObj.onReadFromClick = {
            messageChoicesDialogFragmentObj.dismiss()
            openReadFrom()
        }
    }

    fun openMessageChoicesFragment(){
        // opens MessageChoicesDialogFragment
        messageChoicesDialogFragmentObj = MessageChoicesDialogFragment()
        messageChoicesDialogFragmentObj.show(childFragmentManager, "")
    }
    fun openReadFrom(){
        // opens ReadFromBottomSheetDialogFragment
    }
}

MessageChoicesDialogFragment{
    
    private val onReadFromClick: () -> Unit,

    fun onReadFromButtonClicked(){
          onReadFromClick.invoke()
    }
}

что-то вроде того. Извините, я не смог написать все коды. Это просто для вашего понимания. Делегации очень полезны. Я надеюсь, что это поможет вам.