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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 20:01:33