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

如何从日期选择器计算年龄?Kotlin开发求助

问题分析与修复方案

你的代码存在几个关键问题,导致功能无法正常实现:

1. 编译错误:拼写错误

代码里date1 = findViewById<EditText>(id.date) as EditTe这一行,EditTe是拼写错误,应该改为EditText,否则会直接编译失败。

2. 未实现年龄计算逻辑

你当前只是把出生日期字符串传递到第二个Activity,没有完成计算年龄的核心功能。

3. 冗余变量与不安全的非空断言

  • date1和dob指向同一个EditText控件,属于冗余声明
  • 使用!!非空断言存在空指针风险,建议用更安全的空安全操作

修复后的完整代码

MainActivity 修改版

class MainActivity : AppCompatActivity() {
    private lateinit var datePickerDialog: DatePickerDialog
    private lateinit var submitButton: Button
    private lateinit var userInput: EditText
    private lateinit var dobEditText: EditText

    @SuppressLint("SetTextI18n", "MissingInflatedId", "CutPasteId")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        dobEditText = findViewById(R.id.date)
        userInput = findViewById(R.id.username1)
        submitButton = findViewById(R.id.sub_btn)

        // 日期选择器逻辑
        dobEditText.setOnClickListener {
            val c = Calendar.getInstance()
            val mYear = c[Calendar.YEAR]
            val mMonth = c[Calendar.MONTH]
            val mDay = c[Calendar.DAY_OF_MONTH]

            datePickerDialog = DatePickerDialog(
                this,
                { _, year, monthOfYear, dayOfMonth ->
                    dobEditText.setText("${dayOfMonth}/${monthOfYear + 1}/${year}")
                }, mYear, mMonth, mDay
            )
            datePickerDialog.show()
        }

        // 提交按钮逻辑:计算年龄并跳转
        submitButton.setOnClickListener {
            val name = userInput.text.toString().trim()
            val dobStr = dobEditText.text.toString().trim()

            if (name.isEmpty() || dobStr.isEmpty()) {
                // 简单的输入校验
                Toast.makeText(this, "请填写完整信息", Toast.LENGTH_SHORT).show()
                return@setOnClickListener
            }

            // 解析出生日期
            val dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.getDefault())
            val dobDate = dateFormat.parse(dobStr) ?: run {
                Toast.makeText(this, "日期格式错误", Toast.LENGTH_SHORT).show()
                return@setOnClickListener
            }

            // 计算年龄
            val currentDate = Calendar.getInstance()
            val dobCalendar = Calendar.getInstance().apply { time = dobDate }

            var age = currentDate[Calendar.YEAR] - dobCalendar[Calendar.YEAR]
            // 检查生日是否已过
            if (currentDate[Calendar.DAY_OF_YEAR] < dobCalendar[Calendar.DAY_OF_YEAR]) {
                age--
            }

            // 跳转并传递数据
            val intent = Intent(this, CardReturn::class.java).apply {
                putExtra("user_name", name)
                putExtra("user_age", age)
            }
            startActivity(intent)
        }
    }
}

CardReturnActivity 接收数据示例

class CardReturn : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_card_return)

        // 接收传递的数据
        val userName = intent.getStringExtra("user_name") ?: "未知"
        val userAge = intent.getIntExtra("user_age", 0)

        // 显示到控件(假设你有对应的TextView,id为tv_name和tv_age)
        findViewById<TextView>(R.id.tv_name).text = "姓名:$userName"
        findViewById<TextView>(R.id.tv_age).text = "年龄:$userAge"
    }
}

关键改进点说明

  • 修复了拼写错误,确保代码能正常编译
  • 新增输入校验,避免空数据传递
  • 实现了准确的年龄计算逻辑(考虑当年生日是否已过)
  • 替换不安全的!!为更安全的空处理方式
  • 优化变量命名,提升代码可读性

内容的提问来源于stack exchange,提问作者Shane.B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 11:55:27