【问题标题】:How to pass data from DialogFragment to fragment in android / Kotlin如何将数据从 DialogFragment 传递到 android / Kotlin 中的片段
【发布时间】:2021-08-23 11:39:53
【问题描述】:

我是 Android 应用开发和 Kotlin 的新手。当用户设置时间时,我需要从 DialogFragment 传递时间以更新片段(这是一个选项卡)上的按钮文本。任何建议如何做到这一点。我已经阅读了有关 viewModel 或使用接口的信息,但我无法在我的代码中真正实现它们。

这是我的 fragment_weight.xml

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

    
    <Button
        android:id="@+id/btnTime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Time"
        android:layout_gravity="top|left" />
    
</FrameLayout>

这是我的Weight.kt

package com.example.mytablayout

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment    
import android.widget.Button
import com.example.mytablayout.fragments.TimePickerFragment
import java.util.*    

lateinit var btnTime:Button

class Weight : Fragment() {

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

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

        val c = Calendar.getInstance()            
        val hour = c.get(Calendar.HOUR)
        val minute = c.get(Calendar.MINUTE)            

        btnTime = view.findViewById(R.id.btnTime)
        var btnTimeText = hour.toString() + ':' + minute.toString()
        btnTime.setText(btnTimeText)           

        btnTime.setOnClickListener {
            val newTimeFragment = TimePickerFragment()
            newTimeFragment.show(childFragmentManager, "timePicker")

        }
    }
}

这是我的 TimePickerFragment.kt

package com.example.mytablayout.fragments

import android.app.TimePickerDialog
import android.app.Dialog
import android.os.Bundle
import android.text.format.DateFormat
import android.widget.TimePicker
import androidx.fragment.app.DialogFragment
import java.util.*

class TimePickerFragment: DialogFragment(), TimePickerDialog.OnTimeSetListener {

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        
        val c = Calendar.getInstance()
        val hour = c.get(Calendar.HOUR)
        val minute = c.get(Calendar.MINUTE)
        val dView = TimePickerDialog(requireActivity(), this, hour, minute, DateFormat.is24HourFormat(activity))
        
        return dView
    }

    override fun onTimeSet(view: TimePicker, hour: Int, minute: Int) {
        // Do something with the date chosen by the user           

    }

}

【问题讨论】:

    标签: android kotlin fragment dialogfragment


    【解决方案1】:

    我已阅读有关 viewModel 或使用接口的信息,但我无法在我的代码中真正实现它们。

    您是否阅读了有关与片段通信的文档?

    https://developer.android.com/guide/fragments/communicate#pass-parent-child

    【讨论】:

    • 感谢您的评论。不幸的是,按照文档中的建议在 Weight.kt(即接收器)中使用 childFragmentManager.setFragmentResultListener 会导致错误:没有为参数“p1”传递值。但是,如果我只在接收者中使用 setFragmentResultListener 并在 TimePickerFragment(发送者)中使用 setFragmentResult,我不会收到任何错误,但不会将结果从发送者传递给接收者。
    猜你喜欢
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多