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

Android Studio中点击Submit按钮App崩溃且数据无法传递的问题

个人资料应用崩溃与数据传递问题

这是一款用于熟悉Android Studio的个人资料应用,开发者首次使用Java,开发经验不足。主Activity包含单选按钮、单选组、复选框、TextView、EditText等控件,点击Apply按钮可展示单选按钮和复选框的选择结果;点击Submit按钮本应跳转到第二个界面,展示EditText输入及控件选择的信息,但目前点击Submit时App崩溃,且原本就无法传递EditText数据,修改代码后问题加剧。

Main Activity Java文件

public class MainActivity extends AppCompatActivity {
    @SuppressLint("SetTextI18n")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        applyButton.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view) {
                if (cookingbox.isChecked()) {
                    selectedhobby.setText(selectedhobby.getText().toString() + " " + cookingbox.getText().toString());
                }
                if (sportsbox.isChecked()) {
                    selectedhobby.setText(selectedhobby.getText().toString() + " " + sportsbox.getText().toString());
                }
                if (craftbox.isChecked()) {
                    selectedhobby.setText(selectedhobby.getText().toString() + " " + craftbox.getText().toString());
                }
                if (gamebox.isChecked()) {
                    selectedhobby.setText(selectedhobby.getText().toString() + " " + gamebox.getText().toString());
                }
                if (bookbox.isChecked()) {
                    selectedhobby.setText(selectedhobby.getText().toString() + " " + bookbox.getText().toString());
                }
                if (otherbox.isChecked()) {
                    selectedhobby.setText(selectedhobby.getText().toString() + " " + otherbox.getText().toString());
                }
                if (malebutton.isChecked()) {
                    gendertext.setText(malebutton.getText().toString());
                } else if (femalebutton.isChecked()) {
                    gendertext.setText(femalebutton.getText().toString());
                }
            }
        });
        submitButton.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                Intent Intent;
                Intent = new Intent(MainActivity.this, Screen2Activity.class);
                Intent.putExtra("selectedhobby", "");
                Intent.putExtra("editTextText2", "");
                Intent.putExtra("editTextText4", "");
                Intent.putExtra("editTextText3", "");
                Intent.putExtra("gendertext", "");
                startActivity(Intent);
                setContentView(R.layout.screen2);
            }
        });
    }
}

Screen2 Java文件

import androidx.appcompat.app.AppCompatActivity;

public class Screen2Activity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.screen2);
        ;
        textName = findViewById(R.id.textName);
        textAge = findViewById(R.id.textAge);
        textBirthplace = findViewById(R.id.textBirthplace);
        textHobbies = findViewById(R.id.textHobbies);
        textGender = findViewById(R.id.textGender);

        Intent Intent = getIntent();
        if (Intent != null)
        {
            String editTextText2 = Intent.getStringExtra("editTextText2");
            String editTextText4 = Intent.getStringExtra("editTextText4");
            String selectedhobby = Intent.getStringExtra("selectedhobby");
            String gendertext = Intent.getStringExtra("gendertext");
            Integer editTextText3 = Intent.getIntExtra("editTextText3", -1);
            textName.setText(Log.d("Screen2Activity", "Name :  + editTextText2"));
            textAge.setText(Log.d("Screen2Activity", "Age :  + editTextText3"));
            textBirthplace.setText(Log.d("Screen2Activity", "Birthplace :  + editTextText4"));
            textHobbies.setText(Log.d("Screen2Activity", "Hobbies :  + selectedhobby"));
            textGender.setText(Log.d("Screen2Activity", "Gender :  + gendertext"));
        }

问题分析与修复方案

一、MainActivity核心问题及修复

  1. 控件未初始化:所有控件未通过findViewById绑定,直接调用会触发空指针异常(NPE),这是崩溃的主要原因。
  2. 传递空数据:putExtra仅传空字符串,未获取EditText和选择控件的实际值。
  3. 冗余布局调用:startActivity后调用setContentView完全多余,跳转后当前Activity会被压入栈,无需重复设置布局。
  4. 变量命名不规范:Intent Intent类名与变量名重名,易混淆,建议改为Intent intent。

修复后的MainActivity代码:

public class MainActivity extends AppCompatActivity {
    // 声明控件变量
    private Button applyButton, submitButton;
    private CheckBox cookingbox, sportsbox, craftbox, gamebox, bookbox, otherbox;
    private RadioButton malebutton, femalebutton;
    private TextView selectedhobby, gendertext;
    private EditText editTextText2, editTextText3, editTextText4;

    @SuppressLint("SetTextI18n")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化所有控件
        applyButton = findViewById(R.id.applyButton);
        submitButton = findViewById(R.id.submitButton);
        cookingbox = findViewById(R.id.cookingbox);
        sportsbox = findViewById(R.id.sportsbox);
        craftbox = findViewById(R.id.craftbox);
        gamebox = findViewById(R.id.gamebox);
        bookbox = findViewById(R.id.bookbox);
        otherbox = findViewById(R.id.otherbox);
        malebutton = findViewById(R.id.malebutton);
        femalebutton = findViewById(R.id.femalebutton);
        selectedhobby = findViewById(R.id.selectedhobby);
        gendertext = findViewById(R.id.gendertext);
        editTextText2 = findViewById(R.id.editTextText2);
        editTextText3 = findViewById(R.id.editTextText3);
        editTextText4 = findViewById(R.id.editTextText4);

        applyButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 清空之前的爱好文本,避免重复追加
                selectedhobby.setText("");
                StringBuilder hobbies = new StringBuilder();
                if (cookingbox.isChecked()) hobbies.append(cookingbox.getText()).append(" ");
                if (sportsbox.isChecked()) hobbies.append(sportsbox.getText()).append(" ");
                if (craftbox.isChecked()) hobbies.append(craftbox.getText()).append(" ");
                if (gamebox.isChecked()) hobbies.append(gamebox.getText()).append(" ");
                if (bookbox.isChecked()) hobbies.append(bookbox.getText()).append(" ");
                if (otherbox.isChecked()) hobbies.append(otherbox.getText()).append(" ");
                selectedhobby.setText(hobbies.toString().trim());

                // 设置性别
                if (malebutton.isChecked()) {
                    gendertext.setText(malebutton.getText().toString());
                } else if (femalebutton.isChecked()) {
                    gendertext.setText(femalebutton.getText().toString());
                } else {
                    gendertext.setText("");
                }
            }
        });

        submitButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, Screen2Activity.class);
                // 传递实际数据
                intent.putExtra("selectedhobby", selectedhobby.getText().toString());
                intent.putExtra("name", editTextText2.getText().toString());
                intent.putExtra("birthplace", editTextText4.getText().toString());
                // 处理年龄输入的数字转换
                try {
                    int age = Integer.parseInt(editTextText3.getText().toString());
                    intent.putExtra("age", age);
                } catch (NumberFormatException e) {
                    intent.putExtra("age", -1); // 标记无效年龄
                }
                intent.putExtra("gender", gendertext.getText().toString());
                startActivity(intent);
            }
        });
    }
}

二、Screen2Activity核心问题及修复

  1. 缺少Intent导入:未导入android.content.Intent,会编译报错。
  2. 控件未声明:textName等控件未声明变量,直接赋值会报错。
  3. Log使用错误:Log.d()返回int类型日志优先级,不能直接传给setText(),会触发类型转换异常。
  4. 字符串拼接错误:"Name : + editTextText2"未实际拼接变量值,仅把符号和变量名当成字符串内容。
  5. 代码未闭合:if块和onCreate方法缺少闭合括号。

修复后的Screen2Activity代码:

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.util.Log;
import android.widget.TextView;

public class Screen2Activity extends AppCompatActivity {
    private TextView textName, textAge, textBirthplace, textHobbies, textGender;

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

        // 初始化控件
        textName = findViewById(R.id.textName);
        textAge = findViewById(R.id.textAge);
        textBirthplace = findViewById(R.id.textBirthplace);
        textHobbies = findViewById(R.id.textHobbies);
        textGender = findViewById(R.id.textGender);

        Intent intent = getIntent();
        if (intent != null) {
            String name = intent.getStringExtra("name");
            String birthplace = intent.getStringExtra("birthplace");
            String hobbies = intent.getStringExtra("selectedhobby");
            String gender = intent.getStringExtra("gender");
            int age = intent.getIntExtra("age", -1);

            // 设置文本并处理空值/无效数据
            textName.setText("Name : " + (name != null ? name : "未输入"));
            textAge.setText(age != -1 ? "Age : " + age : "Age : 无效输入");
            textBirthplace.setText("Birthplace : " + (birthplace != null ? birthplace : "未输入"));
            textHobbies.setText("Hobbies : " + (hobbies != null && !hobbies.isEmpty() ? hobbies : "未选择"));
            textGender.setText("Gender : " + (gender != null && !gender.isEmpty() ? gender : "未选择"));

            // 单独输出日志
            Log.d("Screen2Activity", "Name : " + name);
            Log.d("Screen2Activity", "Age : " + age);
            Log.d("Screen2Activity", "Birthplace : " + birthplace);
            Log.d("Screen2Activity", "Hobbies : " + hobbies);
            Log.d("Screen2Activity", "Gender : " + gender);
        }
    }
}

三、额外注意事项

  • 确保布局文件中所有控件ID与代码里findViewById的参数完全一致。
  • 年龄输入框可在布局设置inputType="number",限制用户输入数字,减少异常。
  • 建议用RadioGroup管理性别单选按钮,可直接获取选中项,无需逐个判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 13:49:52