两个Activity代码逻辑一致,MainActivity向MainActivity2传值的Intent失效
问题:Activity间传值异常,从MainActivity到MainActivity2的问题无法传递
我是初学者,在两个Activity中添加了EditText,使用Intent实现页面间信息传递:从MainActivity向MainActivity2传递问题(显示在TextView),从MainActivity2向MainActivity传递答案(显示在TextView)。后者功能正常,但前者无法传递问题,这是怎么回事?
MainActivity 代码
class MainActivity : AppCompatActivity() { private lateinit var bq: ActivityMainBinding private lateinit var runner: ActivityResultLauncher<Intent> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) bq = ActivityMainBinding.inflate(layoutInflater) setContentView(bq.root) runner = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {result: ActivityResult -> if (result.resultCode == RESULT_OK) { val text = result.data?.getStringExtra("Go1") bq.t2.text = text } } } fun onClickGo2 (view: View) { val i = Intent(this, MainActivity2 :: class.java) i.putExtra("Go2", bq.ed1.text.toString()) setResult(RESULT_OK, i) runner.launch(i) } }
MainActivity2 代码
class MainActivity2 : AppCompatActivity() { private lateinit var bq: ActivityMain2Binding private lateinit var runner2: ActivityResultLauncher<Intent> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) bq = ActivityMain2Binding.inflate(layoutInflater) setContentView(bq.root) runner2 = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {result: ActivityResult -> if (result.resultCode == RESULT_OK) { Log.d("MyLog", "Результат ${result.resultCode}") val text = result.data?.getStringExtra("Go2").toString() bq.t4.text = text } } } fun onClickGo1 (view: View) { val i = Intent() i.putExtra("Go1", bq.ed2.text.toString()) setResult(RESULT_OK, i) finish() } }
问题原因
- MainActivity2未读取启动Intent的参数:MainActivity2里错误注册了
ActivityResultLauncher,这个组件是用来启动其他Activity并接收结果的,完全没必要。你根本没从启动当前Activity的Intent中获取MainActivity传递的Go2参数。 - MainActivity存在冗余代码:
onClickGo2里的setResult(RESULT_OK, i)是多余的,MainActivity作为启动方,不需要给自己设置返回结果。
修复方案
修改MainActivity2代码
删掉无用的runner2,在onCreate中直接读取Intent传递的参数:
class MainActivity2 : AppCompatActivity() { private lateinit var bq: ActivityMain2Binding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) bq = ActivityMain2Binding.inflate(layoutInflater) setContentView(bq.root) // 读取MainActivity传递的问题并显示 val question = intent.getStringExtra("Go2") question?.let { bq.t4.text = it } } fun onClickGo1 (view: View) { val i = Intent() i.putExtra("Go1", bq.ed2.text.toString()) setResult(RESULT_OK, i) finish() } }
修改MainActivity代码
删掉onClickGo2里冗余的setResult:
fun onClickGo2 (view: View) { val i = Intent(this, MainActivity2::class.java) i.putExtra("Go2", bq.ed1.text.toString()) runner.launch(i) }
内容的提问来源于stack exchange,提问作者Vadim_Middle
相关产品推荐
相关产品推荐

