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()
}
}
что-то вроде того. Извините, я не смог написать все коды. Это просто для вашего понимания. Делегации очень полезны. Я надеюсь, что это поможет вам.