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

调用自定义Activity的call_back()方法报错:Unable to start activity ComponentInfo

问题分析:调用Android类方法时出现「Unable to start activity ComponentInfo」错误

首先先看一下你提供的代码:

public class ustawienia extends MainActivity { 
    EditText kryptonim; 
    public String test; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.ustawienia); 
        kryptonim = (EditText) findViewById(R.id.edit_kryptonim); 
        test = kryptonim.getText().toString(); 
    } 
    public String call_back(){ 
        return test; 
    } 
}

核心问题所在

你遇到的错误本质是对Android Activity的生命周期和实例化方式理解有误:

  • Activity不能直接用new实例化:ustawienia是Activity的子类,这类组件的实例必须由Android系统通过Intent启动,而不是你手动new ustawienia()创建。如果直接new,系统不会调用它的onCreate方法,导致kryptonim变量一直是null,调用kryptonim.getText()时就会触发NullPointerException,最终引发「Unable to start activity」的崩溃。
  • 文本获取时机不合理:就算是正常启动这个Activity,在onCreate里直接获取EditText的文本也没有意义——此时用户还没来得及输入任何内容,test会是空字符串,而且后续用户修改输入后,test也不会自动更新,因为onCreate只会在Activity创建时执行一次。

正确的解决方案

根据你的需求(从其他类获取这个EditText的内容),推荐两种常用的实现方式:

方式一:通过Intent返回结果(适合子Activity场景)

如果ustawienia是作为一个弹出的设置页面(子Activity),可以在用户完成输入后,把数据返回给调用它的父Activity:

// 修改ustawienia类,添加确认按钮的点击事件
public class UstawieniaActivity extends MainActivity { 
    EditText kryptonim; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.ustawienia); 
        kryptonim = findViewById(R.id.edit_kryptonim); 

        // 添加确认按钮(你需要在布局里先定义这个按钮)
        Button confirmBtn = findViewById(R.id.btn_confirm);
        confirmBtn.setOnClickListener(v -> {
            // 获取用户输入的文本
            String inputText = kryptonim.getText().toString();
            // 把数据封装到Intent返回
            Intent resultIntent = new Intent();
            resultIntent.putExtra("kryptonim", inputText);
            setResult(RESULT_OK, resultIntent);
            finish(); // 关闭当前Activity
        });
    } 
}

然后在调用的父Activity里启动并接收结果:

// 启动UstawieniaActivity
Intent intent = new Intent(this, UstawieniaActivity.class);
startActivityForResult(intent, 100); // 100是自定义请求码,用于区分不同的请求

// 重写方法接收返回结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 100 && resultCode == RESULT_OK) {
        String kryptonim = data.getStringExtra("kryptonim");
        // 在这里处理获取到的内容
    }
}

方式二:用SharedPreferences共享数据(适合跨组件持久化场景)

如果需要在多个类/组件间长期共享这个数据,可以把输入内容保存到SharedPreferences,其他类直接读取即可:

// 在ustawienia类里保存数据(比如在用户输入完成时)
String inputText = kryptonim.getText().toString();
SharedPreferences sp = getSharedPreferences("MyAppPrefs", MODE_PRIVATE);
sp.edit().putString("kryptonim", inputText).apply();

然后在其他类中读取数据:

SharedPreferences sp = getSharedPreferences("MyAppPrefs", MODE_PRIVATE);
String kryptonim = sp.getString("kryptonim", ""); // 第二个参数是默认值,如果没找到返回空字符串

额外提示

Java类名要遵循大驼峰命名规范,建议把ustawienia改成UstawieniaActivity,这样代码可读性更高,也符合Android开发的最佳实践。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:05:38