Android开发:如何在Timesheet Fragment中展示ActivityCard的活动详情?
实现ActivityCard到Timesheet的数据传递与展示
第一步:创建数据类统一管理活动信息
先建一个ActivityData类,把活动的所有信息封装起来,方便传递:
import android.os.Parcelable import kotlinx.parcelize.Parcelize @Parcelize data class ActivityData( val title: String, // 活动标题(比如Debugging App) val date: String, // 活动日期(比如Mon 23 May 2023) val startTime: String, // 开始时间(比如13:00) val endTime: String, // 结束时间(比如14:00) val duration: String // 时长(比如1h 0m) ) : Parcelable
注意:要使用Parcelable,需要在app模块的build.gradle里添加插件:
plugins { // ... 其他插件 id 'kotlin-parcelize' }
第二步:在ActivityCard中获取并传递数据
在ActivityCard Fragment里,先拿到布局控件的文本内容,拆分起止时间后封装成ActivityData,再传递给Timesheet:
class ActivityCard : Fragment() { private lateinit var binding: FragmentActivityCardBinding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { binding = FragmentActivityCardBinding.inflate(inflater, container, false) return binding.root } // 假设用户点击某个按钮触发数据传递(比如保存按钮) private fun sendDataToTimesheet() { // 获取控件文本 val title = binding.activityCardTitle.text.toString() val date = binding.activityDate.text.toString() val startEndStr = binding.startEndTimes.text.toString() val duration = binding.duration.text.toString() // 拆分起止时间(按" -> "分割) val timeParts = startEndStr.split(" -> ") val startTime = timeParts[0] val endTime = timeParts[1] // 封装成数据对象 val activityData = ActivityData(title, date, startTime, endTime, duration) // 场景1:用Navigation组件跳转(推荐) val action = ActivityCardDirections.actionActivityCardToTimesheet(activityData) findNavController().navigate(action) // 场景2:手动切换Fragment(如果不用Navigation) /* val timesheetFragment = Timesheet() val bundle = Bundle().apply { putParcelable("ACTIVITY_DATA", activityData) } timesheetFragment.arguments = bundle parentFragmentManager.beginTransaction() .replace(R.id.fragment_container, timesheetFragment) .addToBackStack(null) .commit() */ } }
第三步:在Timesheet中接收并展示数据
在Timesheet Fragment里拿到传递过来的ActivityData,填充到对应的TextView中:
class Timesheet : Fragment() { private lateinit var binding: FragmentTimesheetBinding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { binding = FragmentTimesheetBinding.inflate(inflater, container, false) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 接收数据 // 用Navigation的Args方式 val args = TimesheetArgs.fromBundle(requireArguments()) val activityData = args.activityData // 或者用Bundle方式(对应手动切换Fragment的场景) // val activityData = arguments?.getParcelable<ActivityData>("ACTIVITY_DATA") activityData?.let { data -> // 填充第一个活动条目(匹配你的布局) binding.textView11.text = data.date // 任务日期 binding.textView12.text = data.startTime // 任务开始时间 binding.textView13.text = data.endTime // 任务结束时间 binding.textView14.text = data.title // 任务描述(对应活动标题) binding.textView15.text = "默认分类" // 分类(你的ActivityCard暂未提供,可自行补充) } } }
布局优化建议
你当前的fragment_timesheet.xml是硬编码3个活动条目,长期使用不够灵活。建议改成RecyclerView实现动态条目:
- 新建
activity_item.xml作为单个活动的条目布局 - 在
fragment_timesheet.xml中替换为RecyclerView - 编写
ActivityAdapter绑定数据,支持添加任意数量的活动
内容的提问来源于stack exchange,提问作者Luke Jones
相关产品推荐
相关产品推荐

