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

Android模拟器新Activity创建表格崩溃求助(无错误提示)

问题定位与修复方案

崩溃核心原因

  1. 空指针异常:找不到R.id.main视图
    你的XML布局中只有TableLayout(id为table_layout),但代码里调用了findViewById(R.id.main),这个视图不存在,直接调用setOnApplyWindowInsetsListener会触发空指针崩溃。

  2. 静态数组访问风险
    直接读取MainActivity.grades静态数组,如果该数组在MainActivity中未初始化或为null,会触发空指针异常;另外这种跨Activity直接访问静态变量的方式也不符合Android开发规范,容易引发生命周期相关问题。

  3. 表格结构不符合需求
    当前代码仅循环渲染成绩数组,没有实现「Subjects表头+学生姓名列」的结构,逻辑上不符合需求。

修复步骤与代码

步骤1:修正WindowInsets监听的视图

将监听绑定到存在的table_layout上,或者直接移除该监听(如果不需要适配系统栏)。

步骤2:安全传递成绩数据

通过Intent传递成绩数组(因为double数组可序列化),而非直接访问静态变量,避免空指针和生命周期问题。

步骤3:构建符合需求的表格结构

先添加表头行(包含空单元格+学生姓名),再逐行添加科目名称+对应成绩。


修改后的XML布局(无需改动,保持原布局即可)

<?xml version="1.0" encoding="utf-8"?>
<TableLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/table_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:stretchColumns="*"
    tools:context=".launchTable">
</TableLayout>

添加android:stretchColumns="*"让表格列自动适配宽度

修改后的Java代码

package com.example.myapplication;

import android.os.Bundle;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class launchTable extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_launch_table);

        // 修正WindowInsets监听,绑定到存在的table_layout
        TableLayout tableLayout = findViewById(R.id.table_layout);
        ViewCompat.setOnApplyWindowInsetsListener(tableLayout, (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });

        // 从Intent获取成绩数据(替代直接访问静态变量)
        double[][] grades = getIntent().getDoubleArrayExtra("grades");
        String[] subjects = {"Science", "Math", "English"};
        String[] students = {"Sarah", "John", "Emily", "Dave"};

        // 校验数据非空,避免空指针
        if (grades == null || grades.length != subjects.length) {
            return;
        }

        // 1. 添加表头行:空单元格(对应科目列) + 学生姓名
        TableRow headerRow = new TableRow(this);
        // 空表头单元格
        TextView emptyHeader = new TextView(this);
        emptyHeader.setText("Subjects");
        headerRow.addView(emptyHeader);
        // 添加学生姓名列
        for (String student : students) {
            TextView tv = new TextView(this);
            tv.setText(student);
            tv.setPadding(16, 16, 16, 16);
            headerRow.addView(tv);
        }
        tableLayout.addView(headerRow);

        // 2. 添加成绩行:科目名称 + 对应学生成绩
        for (int i = 0; i < subjects.length; i++) {
            TableRow row = new TableRow(this);
            // 添加科目名称
            TextView subjectTv = new TextView(this);
            subjectTv.setText(subjects[i]);
            subjectTv.setPadding(16, 16, 16, 16);
            row.addView(subjectTv);
            // 添加对应学生成绩
            for (int j = 0; j < students.length; j++) {
                TextView gradeTv = new TextView(this);
                // 确保成绩数组维度匹配
                if (j < grades[i].length) {
                    gradeTv.setText(String.valueOf(grades[i][j]));
                } else {
                    gradeTv.setText("-");
                }
                gradeTv.setPadding(16, 16, 16, 16);
                row.addView(gradeTv);
            }
            tableLayout.addView(row);
        }
    }
}

补充:MainActivity中传递数据的代码

在MainActivity启动launchTable时,通过Intent传递成绩数组:

// 假设grades是MainActivity中已初始化的double[][]数组
Intent intent = new Intent(MainActivity.this, launchTable.class);
intent.putExtra("grades", grades);
startActivity(intent);

额外建议

  • 避免直接访问其他Activity的静态变量,尽量通过Intent、ViewModel等规范方式传递数据
  • 始终对外部传入或跨组件访问的数据做非空校验
  • 给TextView添加内边距可以提升表格可读性

内容的提问来源于stack exchange,提问作者fahim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 02:33:18