Android模拟器新Activity创建表格崩溃求助(无错误提示)
问题定位与修复方案
崩溃核心原因
空指针异常:找不到
R.id.main视图
你的XML布局中只有TableLayout(id为table_layout),但代码里调用了findViewById(R.id.main),这个视图不存在,直接调用setOnApplyWindowInsetsListener会触发空指针崩溃。静态数组访问风险
直接读取MainActivity.grades静态数组,如果该数组在MainActivity中未初始化或为null,会触发空指针异常;另外这种跨Activity直接访问静态变量的方式也不符合Android开发规范,容易引发生命周期相关问题。表格结构不符合需求
当前代码仅循环渲染成绩数组,没有实现「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
相关产品推荐
相关产品推荐

