Kotlin中全局声明LinearLayout变量致App崩溃问题求助
全局LinearLayout变量崩溃与函数内声明逻辑错误的解决
全局变量崩溃的根源与修复
直接在Activity类成员位置初始化indcon时,Activity尚未执行setContentView加载布局,此时findViewById(R.id.indicatorsContainer)会返回null,触发空指针异常导致崩溃。
正确的做法是用lateinit延迟初始化变量,在onCreate中布局加载完成后再赋值:
class MainActivity : AppCompatActivity() { lateinit var indcon: LinearLayout private val introSliderAdapter = IntroSliderAdapter() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.your_main_layout) // 替换为你的布局ID indcon = findViewById(R.id.indicatorsContainer) setupIndicators() } private fun setupIndicators() { val indicators = arrayOfNulls<ImageView>(introSliderAdapter.itemCount) val layoutParams = LinearLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT).apply { setMargins(8, 0, 8, 0) } for (i in indicators.indices) { indicators[i] = ImageView(applicationContext).apply { setImageDrawable(ContextCompat.getDrawable(applicationContext, R.drawable.indcator_inactive)) layoutParams = layoutParams } indcon.addView(indicators[i]) } } private fun setCurrentIndicater(index: Int) { val childCount = indcon.childCount for (i in 0 until childCount) { val imageView = indcon.getChildAt(i) as ImageView imageView.setImageDrawable( ContextCompat.getDrawable( applicationContext, if (i == index) R.drawable.indcator_active else R.drawable.indcator_inactive ) ) } } }
函数内声明变量结果不符的修复
setCurrentIndicater函数的else分支仅获取了非激活状态的Drawable,但未设置给ImageView,导致未选中的指示器状态不会更新。修正后代码:
private fun setCurrentIndicater(index: Int) { val indcon2: LinearLayout = findViewById(R.id.indicatorsContainer) val childCount = indcon2.childCount for (i in 0 until childCount) { val imageView = indcon2.getChildAt(i) as ImageView if (i == index) { imageView.setImageDrawable(ContextCompat.getDrawable(applicationContext, R.drawable.indcator_active)) } else { imageView.setImageDrawable(ContextCompat.getDrawable(applicationContext, R.drawable.indcator_inactive)) } } }
优先推荐全局延迟初始化的方案,避免重复调用findViewById,同时代码更简洁易维护。
内容的提问来源于stack exchange,提问作者Awash
相关产品推荐
相关产品推荐

