You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实现动态条目:

  1. 新建activity_item.xml作为单个活动的条目布局
  2. 在fragment_timesheet.xml中替换为RecyclerView
  3. 编写ActivityAdapter绑定数据,支持添加任意数量的活动

内容的提问来源于stack exchange,提问作者Luke Jones

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:48:12