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

