调用自定义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
相关产品推荐
相关产品推荐

