首页 > 解决方案 > 如何将选中的单选按钮传递给 Kotlin 中的其他活动

问题描述

对于一个 android 应用程序,我的 MainActivity 中有一个带有三个 RadioButtons(rb1,rb2,rb3) 的 RadioGroup。每个 RadioButton 都会导致另一个活动(Activity1、Activity2、Activity3)。从这三个活动中的任何一个,用户现在都可以通过操作栏转到 SettingActivity。SettingActivity 与我的 MainActivity 具有相同的 RadioGroup。这就是我有多远。

现在的问题是:
在我的 SettingActivity 中,我不希望 RadioGroup 默认处于未选中状态。相反,我想在默认情况下检查用户之前在 MainActivity 中选择的 RadioButton。有没有办法做到这一点,而不必创建多个设置活动,每个活动都有不同的默认按钮?

我的主要活动:

btnContinue.setOnClickListener {
            if (rb1.isChecked){
                    val intent = Intent(this, Activity1::class.java)
                    intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK)
                    startActivity(intent)
                }

            else if (rb2.isChecked){
                    val intent = Intent(this, Activity2::class.java)
                    intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK)
                    startActivity(intent)
                }

            else if (rb3.isChecked){
                    val intent = Intent(this, Activity3::class.java)
                    intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK)
                    startActivity(intent)
                }
            else{
                    Toast.makeText(applicationContext, "Make a selection", Toast.LENGTH_SHORT).show()
                }
            }

我的活动1、2、3:

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.actionbar, menu)
    return true
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    val id = item.itemId

    if (id == R.id.settings) {
        val intent = Intent(this,SettingActivity::class.java)
        startActivity(intent) }

    return super.onOptionsItemSelected(item)
}

我的设置活动:

btnSave.setOnClickListener {
        if (rb1.isChecked){
                val intent = Intent(this, Activity1::class.java)
                startActivity(intent)
            }

        else if (rb2.isChecked){
                val intent = Intent(this, Activity2::class.java)
                startActivity(intent)
            }

        else if (rb3.isChecked){
                val intent = Intent(this, Activity3::class.java)
                startActivity(intent)
            }
        }

标签: androidandroid-activitykotlinradio-button

解决方案


首先,我们创建一个启动活动的“通用”函数。这将删除冗余代码。

private fun startActivity(activity: Class<*>, radioButtonId: Int) {
    val intent = Intent(this, activity)
    intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK)
    intent.putExtra("checkedRadioButtonID", radioButtonId)
    startActivity(intent)
}



btnContinue.setOnClickListener {
    when {
          rb1.isChecked -> startActivity(Activity1::class.java, 1)
          rb2.isChecked -> startActivity(Activity2::class.java, 2)
          rb3.isChecked -> startActivity(Activity3::class.java, 3)
          else -> Toast.makeText(applicationContext, "Make a selection", Toast.LENGTH_SHORT).show()
      }
  }

现在在您的三个活动中,您向每个活动发送了一个额外的意图,如何?查看我们如何启动活动的代码。我们放intent.putExtra(),所以我们可以将数据转发到每个活动。由于每个活动都有一个数据,即单选按钮 ID,我们可以将此数据转发给设置活动。

override fun onCreateOptionsMenu(menu: Menu): Boolean {
   menuInflater.inflate(R.menu.actionbar, menu)
   return true
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    val id = item.itemId

    if (id == R.id.settings) {
        val buttonId = intent.extras?.getInt("checkedRadioButtonID") //This is where we get the radio button ID in the different activity
       val intent = Intent(this,SettingActivity::class.java)
       intent.putExtra("forwardedRadioButtonId", buttonId)
       startActivity(intent)
   }

    return super.onOptionsItemSelected(item)
}

对于设置活动

现在我们得到从 MainActivity -> Activity1/2/3 -> SettingActivity 转发的单选按钮 ID

val buttonId = intent.extras?.getInt("forwardedRadioButtonId")

when (buttonId) {
  1 -> rb1.isChecked = true
  2 -> rb2.isChecked = true
  3 -> rb3.isChcked = true
}

最后,只会选中最初在MainActivity.


推荐阅读