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

Android应用启动MainActivity崩溃,因getString(R.string.xxx)调用时机错误

问题解决:AutoCompleteTextView货币选项随语言切换且避免启动崩溃

崩溃原因

你在Activity的成员变量初始化阶段直接调用getString(),此时Activity尚未完成创建,Context还未初始化,调用依赖Context的方法会导致空指针或非法状态异常,引发应用崩溃。

解决方案

1. 延迟初始化货币变量与汇率映射

将货币字符串变量和汇率map改为延迟初始化,等到onCreate()方法执行(此时Context已可用)时再赋值:

修改MainActivity的成员变量定义与初始化逻辑:

class MainActivity : AppCompatActivity() {
    // 延迟初始化货币字符串
    private lateinit var EGP: String
    private lateinit var USD: String
    private lateinit var SAR: String
    private lateinit var KWD: String
    
    private lateinit var convertButton: Button
    private lateinit var amount: TextInputEditText
    private lateinit var result: TextInputEditText
    private lateinit var from: AutoCompleteTextView
    private lateinit var to: AutoCompleteTextView
    
    // 延迟初始化汇率映射
    private lateinit var listValue: Map<String, Double>
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        // 先初始化货币相关值
        initCurrencyValues()
        initalizeViews()
        populateMenu()
        
        // 原有交互逻辑
        convertButton.setOnClickListener { calcResault() }
        amount.addTextChangedListener { calcResault() }
    }
    
    private fun initCurrencyValues() {
        EGP = getString(R.string.egyptian_pound_egp)
        USD = getString(R.string.american_dollar_usd)
        SAR = getString(R.string.Saudia_Ryal)
        KWD = getString(R.string.Kuwaiti_Dinar)
        
        listValue = mapOf(
            USD to 0.052356,
            EGP to 1.0,
            SAR to 0.197040,
            KWD to 0.0166838
        )
    }
    
    // 原有initalizeViews、populateMenu、calcResault方法保持不变
}

2. 支持语言动态切换

如果需要在应用运行时切换系统语言后自动更新货币选项,需补充以下配置:

步骤1:在AndroidManifest.xml中配置Activity的configChanges

<activity
    android:name=".MainActivity"
    android:configChanges="locale|layoutDirection">
</activity>

步骤2:重写onConfigurationChanged方法更新选项

在MainActivity中添加如下代码:

override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)
    // 重新加载货币字符串与汇率映射
    initCurrencyValues()
    // 更新AutoCompleteTextView的适配器
    populateMenu()
}

这样当系统语言切换时,Activity会自动重新加载对应语言的字符串,并更新下拉选项列表。

关键说明

  • 所有依赖Context的操作(如getString())必须在Activity生命周期方法(如onCreate())执行后调用,避免因Context未初始化引发崩溃。
  • 使用lateinit关键字声明变量,既保留了变量的成员属性,又确保了在使用前完成初始化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:15:41