Kotlin应用启动时MainActivity的TextView显示为空问题求助
双Activity传值导致MainActivity启动时TextView为空的解决方法
问题原因
应用首次启动MainActivity时,启动它的Intent并未携带Name这个Extra参数,intent.getStringExtra("Name")会返回null,直接将这个null值赋值给TextView的text属性,就会覆盖布局里预设的默认文本"Welcome",导致启动时显示为空。
基础修复方案
给获取到的name设置默认值,当name为null时使用默认的"Welcome",修改MainActivity代码如下:
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val result = findViewById<TextView>(R.id.nomeUser) val nameEntered = findViewById<EditText>(R.id.nameEntered) val button = findViewById<Button>(R.id.button) button.setOnClickListener{ val name = nameEntered.text.toString() val intent = Intent(this@MainActivity, NomeEscrito::class.java) intent.putExtra("Name", name) startActivity(intent) } // 为name设置默认值,避免null导致文本为空 val name = intent.getStringExtra("Name") ?: "Welcome" result.text = name } }
更规范的传值优化(可选)
当前从SecondActivity启动MainActivity会创建新的实例,而非回到原有的MainActivity,这不符合常规的页面返回逻辑。推荐使用registerForActivityResult实现数据回传:
修改后的MainActivity代码
class MainActivity : AppCompatActivity() { // 注册Activity结果回调 private val getBackResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data = result.data val name = data?.getStringExtra("Name") ?: "Welcome" findViewById<TextView>(R.id.nomeUser).text = name } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val result = findViewById<TextView>(R.id.nomeUser) val nameEntered = findViewById<EditText>(R.id.nameEntered) val button = findViewById<Button>(R.id.button) // 首次启动直接设置默认文本 result.text = "Welcome" button.setOnClickListener{ val name = nameEntered.text.toString() val intent = Intent(this@MainActivity, NomeEscrito::class.java) intent.putExtra("Name", name) // 通过回调启动Activity getBackResult.launch(intent) } } }
修改后的NomeEscrito(SecondActivity)代码
class NomeEscrito : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_nome_escrito) val intent = intent val name = intent.getStringExtra("Name") val result = findViewById<TextView>(R.id.result) result.text = name val wordEntered = findViewById<EditText>(R.id.textPhrase) val button2 = findViewById<Button>(R.id.button2) button2.setOnClickListener{ val name2 = wordEntered.text.toString() // 回传数据给上一个Activity val intent2 = Intent() intent2.putExtra("Name", name2) setResult(RESULT_OK, intent2) // 关闭当前Activity,回到原MainActivity finish() } } }
内容的提问来源于stack exchange,提问作者Bernardo Almeida
相关产品推荐
相关产品推荐

