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

Android通过Intent跳转Activity时传递的input值未更新问题咨询

错误原因

你在MainActivity中手动实例化的second_activity对象sec和系统启动Activity时自动创建的实例是完全独立的两个对象,你给sec.input赋值不会对实际运行的第二个Activity产生任何影响,所以拿到的永远是初始空值,var sec = second_activity()这行代码属于无效代码,可以直接删除。

修复方案

修改MainActivity传值逻辑

通过Intent携带参数实现跨Activity传值,修改点击事件代码如下:

// 删去无用的 var sec = second_activity() 声明
var button1: Button? = null
var button2: Button? = null
var button3: Button? = null
var button4: Button? = null

button1 = findViewById<View>(R.id.button1) as Button
button2 = findViewById<View>(R.id.button2) as Button
button3 = findViewById<View>(R.id.button3) as Button
button4 = findViewById<View>(R.id.button4) as Button

button1?.setOnClickListener {
    val intent: Intent = Intent(this, second_activity::class.java)
    // 把参数存入Intent
    intent.putExtra("input_value", "a")
    startActivity(intent)
}
button2?.setOnClickListener {
    val intent: Intent = Intent(this, second_activity::class.java)
    intent.putExtra("input_value", "b")
    startActivity(intent)
}

修改second_activity取值逻辑

在onCreate中从Intent取出传递的参数即可,同时需要补充列表数据变更后的刷新通知,不然列表不会显示内容:

class second_activity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

    private lateinit var toolbar: Toolbar
    private lateinit var mDrawerLayout: DrawerLayout
    // 无需提前声明input变量,直接从Intent取值即可
    // var input : String = " "

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        // 从Intent获取传递的参数,拿不到时默认返回空格
        val input = intent.getStringExtra("input_value") ?: " "
 
        val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
        recyclerView.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false)
        val users = ArrayList<User>()
        val adapter = CustomAdapter(this , users)
        recyclerView.adapter = adapter

        Toast.makeText(this, input , Toast.LENGTH_SHORT).show()

        when(input) {
            "a" ->  {
                users.add(User(R.drawable.bc))
                // 通知适配器数据变更,刷新列表
                adapter.notifyDataSetChanged()
            }
            "b" -> {
                repeat(4) {
                    users.add(User(R.drawable.bc))
                }
                adapter.notifyDataSetChanged()
            }
        }
    }
}
其他识别点击按钮的常用方法

如果按钮数量较多,不想每个按钮单独定义传值,可以用以下方案:

  • 传递按钮资源ID:给所有按钮绑定同一个点击监听器,直接把点击的按钮ID通过Intent传递,第二个Activity直接判断ID即可:
// MainActivity里统一设置点击事件
val commonClickListener = View.OnClickListener { v ->
    val intent = Intent(this, second_activity::class.java)
    intent.putExtra("clicked_button_id", v.id)
    startActivity(intent)
}
button1?.setOnClickListener(commonClickListener)
button2?.setOnClickListener(commonClickListener)
button3?.setOnClickListener(commonClickListener)
button4?.setOnClickListener(commonClickListener)
// second_activity里判断
when(intent.getIntExtra("clicked_button_id", 0)) {
    R.id.button1 -> // 执行按钮1对应的逻辑
    R.id.button2 -> // 执行按钮2对应的逻辑
    R.id.button3 -> // 执行按钮3对应的逻辑
    R.id.button4 -> // 执行按钮4对应的逻辑
}
  • 使用Activity Result API传请求码:如果需要第二个Activity返回结果给主Activity,可以用这个方案,启动时传入不同的请求码区分按钮,适合需要双向通信的场景。
  • 不推荐用静态变量存储点击标识,容易出现内存泄漏、多实例场景值错乱的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:48:02