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

Android开发求助:代码无报错但findViewById获取控件返回null

问题原因与修复方案

核心问题

你在加载布局之前就调用了findViewById,这是控件返回null的根本原因。Activity必须先通过setContentView加载布局文件,系统才能实例化布局中的控件,此时调用findViewById才能找到对应控件。你的代码把findViewById放在了super.onCreate(savedInstanceState)和setContentView(R.layout.activity_quiz)之前,布局未加载时控件不存在,自然返回null。

正确执行顺序

在onCreate方法中必须严格遵循以下顺序:

  1. 调用super.onCreate(savedInstanceState)(初始化Activity基础框架)
  2. 调用setContentView(R.layout.activity_quiz)(加载当前Activity对应的布局)
  3. 调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:24:19