Android开发求助:代码无报错但findViewById获取控件返回null
问题原因与修复方案
核心问题
你在加载布局之前就调用了findViewById,这是控件返回null的根本原因。Activity必须先通过setContentView加载布局文件,系统才能实例化布局中的控件,此时调用findViewById才能找到对应控件。你的代码把findViewById放在了super.onCreate(savedInstanceState)和setContentView(R.layout.activity_quiz)之前,布局未加载时控件不存在,自然返回null。
正确执行顺序
在onCreate方法中必须严格遵循以下顺序:
- 调用
super.onCreate(savedInstanceState)(初始化Activity基础框架) - 调用
setContentView(R.layout.activity_quiz)(加载当前Activity对应的布局) - 调用
findViewById获取布局中的控件实例
修正后的完整代码
package com.example.myquizapp import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.widget.ProgressBar import android.widget.TextView class QuizActivity : AppCompatActivity() { private var progressBar : ProgressBar?= null private var tvProgress : TextView? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_quiz) // 布局加载完成后再获取控件 progressBar = findViewById(R.id.progressBar) tvProgress = findViewById(R.id.tv_progress) val currentPosition = 1 progressBar?.progress = currentPosition tvProgress?.text = "${currentPosition}/${progressBar?.max}" // 修正原日志语句的语法错误 Log.e("currentPosition", "${currentPosition}") Log.e("ProgressBar", "${progressBar}") Log.e("TvProgress", "${tvProgress}") Log.e("tvProgressText", "${tvProgress?.text ?: "null"}") } }
额外说明
原代码中的日志语句存在语法错误(缺少逗号、引号不匹配),修正后的代码已一并调整,避免编译错误。
内容的提问来源于stack exchange,提问作者Harsh Chauhan
相关产品推荐
相关产品推荐

