Почему фрагмент не реализует интерфейс Listener?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Почему фрагмент не реализует интерфейс Listener?

Сообщение Anonymous »


Я уже реализовал интерфейс DialogListener через DialogFragment и NoteFragment

Прослушиватель диалогов

интерфейс DialogListener { fun onConfirmAddDialogResult (заголовок: String, текст: String, дата: String, timeStart: String, timeEnd: String) удовольствие onScheduleItemDeleted (isDelete: Boolean) } И вот во фрагменте заметки я успешно реализовал интерфейс и никаких ошибок не выдал.

переопределить fun onConfirmAddDialogResult( название: Строка, текст: Строка, дата: Строка, timeStart: строка, timeEnd: строка ) { val data = ScheduleItem( текст = заголовок, описание = текст, дата = дата, startTime = время начала, КонецВремя = Конец времени, продолжительность = вычислитьDuration(timeStart, timeEnd), isCompleteTask = ложь ) viewModel.addData(данные) } В DialogFragment я сделал проверку реализации интерфейса и отправки в него данных.

class AddDialogFragment(private val layoutResourceId: Int) : DialogFragment() { частный lateinit var диалогаListener: DialogListener частный lateinit var saveButton: ImageButton частный lateinit var cancelButton: ImageButton переопределить fun onAttach(context: Context) { super.onAttach(контекст) пытаться { DialogListener = родительский фрагмент как DialogListener } catch (e: ClassCastException) { throw ClassCastException("Родительский фрагмент должен реализовывать DialogListener") } } личное развлечение handleSaveButtonClicked() { DialogListener.onConfirmAddDialogResult(заголовок, текст, дата, timeStart, timeEnd) } } Так вот и сам вопрос: почему при попытке реализовать интерфейс так же, как с DialogFragment, возникает ошибка в BottomSheetDialogFragment, который я прикрепил ниже.

E ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основное Процесс: com.example.diarycourse, PID: 13415. java.lang.NullPointerException: значение null не может быть приведено к ненулевому типу com.example.diarycourse.features.dialogs.DialogListener в com.example.diarycourse.features.dialogs.ScheduleItemBottomSheetFragment.onAttach(ScheduleItemBottomSheetFragment.kt:40) в androidx.fragment.app.Fragment.performAttach(Fragment.java:3068) в androidx.fragment.app.FragmentStateManager.attach(FragmentStateManager.java:490) в androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:265) .....

Если вам нужно, как я реализую интерфейс в NoteFragment и взаимодействую с ним в BottomSheetDialogFragment, то код ниже.

Реализация интерфейса в NoteFragment:

переопределить fun onScheduleItemDeleted(isDelete: Boolean) { если (исудалить) viewModel.fetchData() } BottomSheetDialogFragment:
класс ScheduleItemBottomSheetFragment : BottomSheetDialogFragment() { частный lateinit var диалогаListener: DialogListener @Инжект lateinit var useCase: UseCase переопределить fun onAttach(context: Context) { super.onAttach(контекст) (context.applicationContext как приложение).appComponent.inject(this) пытаться { DialogListener = родительский фрагмент как DialogListener } catch (e: ClassCastException) { throw ClassCastException("Родительский фрагмент должен реализовывать DialogListener") } } @SuppressLint («Миссингинфлатедид») переопределить удовольствие onCreateView( надуватель: LayoutInflater, контейнер: ViewGroup?, saveInstanceState: Пакет? ): Вид? { val view = inflater.inflate(R.layout.fragment_schedule_item_bottom_sheet, контейнер, false) val ScheduleItem = аргументы?.getParcelable("ScheduleItem") если (scheduleItem!= ноль) { .... deleteButton.setOnClickListener { ScheduleItem.id?.let { lifecycleScope.launch { результат val = useCase.deleteById(it) if (результат Resource.Success) { диалогListener.onScheduleItemDeleted (истина) увольнять() } else if (результат Resource.Empty.Failed) { диалогListener.onScheduleItemDeleted(false) Toast.makeText(requireContext(), «Ошибка», Toast.LENGTH_SHORT).show() } } } } } обратный вид } }
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»