我正在自学柯特林.我正在try 计算用户在输入他们的出生日期后的年龄,并将其显示在另一个活动中.

我试了很多不同的方法,但都不管用.我想我可能忽略了一些简单的东西.

我的代码是:


class MainActivity : AppCompatActivity() {
    var date1: EditText? = null
    var datePickerDialog: DatePickerDialog? = null
    lateinit var submitButton: Button
    lateinit var userInput: EditText
    lateinit var dob: EditText
    @SuppressLint("SetTextI18n", "MissingInflatedId", "CutPasteId")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(layout.activity_main)
        date1 = findViewById<EditText>(id.date) as EditTe
        date1!!.setOnClickListener{ // calender class's instance and get current date , month and year from calender
            val c = Calendar.getInstance()
            val mYear = c[Calendar.YEAR] // current year
            val mMonth = c[Calendar.MONTH] // current month
            val mDay = c[Calendar.DAY_OF_MONTH] // current day
            datePickerDialog = DatePickerDialog(
                this@MainActivity,
                { view, year, monthOfYear, dayOfMonth -> // set day of month , month and year value in the edit text
                    date1!!.setText(
                        dayOfMonth.toString() + "/"
                                + (monthOfYear + 1) + "/" + year
                    )
                }, mYear, mMonth, mDay

            )
            datePickerDialog!!.show()

        }

        submitButton = findViewById(id.sub_btn)
        userInput = findViewById(id.username1)
        dob = findViewById(id.date)

        submitButton.setOnClickListener {
            val age= dob.text.toString()
            val name= userInput.text.toString()
            //val str = userInput.text.toString()
            intent = Intent(this, CardReturn::class.java)
            intent.putExtra("message_key","Name:$name")
            intent.putExtra("message_key1","DOB:$age")
            startActivity(intent)
        }


    }}

推荐答案

如果您能够使用java.time或至少ThreeTen Android Backport,这应该是容易的,并将节省大量的工作,如果您使用的是java.util.Calendar.

这是一个DatePickerDialog个的小作品,你可以很容易地复制和粘贴,这就是我如何计算year difference between two LocalDate实例

val now = LocalDateTime.now()
val initYear = now.year
val initMonth = now.monthValue - 1 // offset it -1 because January starts at 0 index
val initDay = now.dayOfMonth

val datePickerDialog = DatePickerDialog(
       this@ActivityOrContext, 
       { _: DatePicker, pickedYear: Int, pickedMonth: Int, pickedDay: Int ->

            val selectedBirthdate = LocalDate.of(pickedYear, pickedMonth + 1, pickedDay)
            val age = Period.between(selectedBirthdate, LocalDate.now()).years

            Log.e("DatePickerTag", "Age : $age")

       }, initYear, initMonth, initDay)

如果我 Select April 1 1995,并根据这篇帖子的时间进行判断,它将打印出来

E/DatePickerTag: Age : 27

然而,如果你不能使用java.timeThreeTenABP,这S.O post可能会在其他方面帮助你.这篇文章的底部包含了使用java.util.Calendar计算age的答案.

最后,脱离主题,考虑what lateinit var is forwhat kotlin null safety is,并避免在代码中不必要地大喊大叫!!

Android相关问答推荐

打开平板电脑的下载文件夹中的文件,例如使用其mimeType将Intent发送到我们的应用程序

道查询注释部分房间表名称

Jetpack Compose-如何使用值动画直接控制其他动画

Kotlin DSL:为什么我可以从Play Store获取发布版本的日志(log)?

安卓喷气背包组成倒计时动画

如何在Jetpack Compose中向SearchBar添加边框

SDK 33 的问题 - 面向 S+(版本 31 及更高版本)要求在创建 PendingIntent 时指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一

布局可组合项如何具有可测量和约束参数?

如何禁用自动登录 google play games services android unity?

如何在ExecutorService中设置progressBar的进度?不想使用 AsyncTask,因为它已被弃用

React-native 3D对象渲染

PullRefreshIndicator 与 ScrollableTabRow 重叠

Android collectAsStateWithLifecycle() 不在可组合内部收集

验证硬编码密码

try 使用 ViewPager2 实现滑动视图时出现类型不匹配错误

如何对齐文本和图标可组合,以便即使在文本溢出后它们也能保持在一起?

GridLayout 和 GridView 有什么好用和区别

更新应用程序是否会取消对应用程序特定文件的权限?

ObjectBox,如何在冲突中放弃一切迁移?

在 Android Studio 中保存数据