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
相关产品推荐
相关产品推荐

