调用另一个类中方法为Activity的EditText设置文本出现空指针异常
问题产生原因
你出现空指针的核心原因是你手动创建了新的Activity实例,而非使用当前正在运行的原有Activity实例:
- Android的Activity实例由系统负责创建、管理生命周期,只有走了系统触发的
onCreate生命周期的Activity,才会完成布局加载、控件初始化(你的date控件就是在系统触发的onCreate里通过findViewById赋值的) - 你在
DateDialog的SetDateString方法里写的Activity act= new Activity()是你自己手动new的空实例,这个实例从未走onCreate流程,内部的date控件完全没有被赋值,调用它的setdate方法时访问date控件自然会抛出空指针异常。
解决方法
你只需要把当前正在运行的Activity实例传给DateDialog即可,修改步骤如下:
- 首先修改DateDialog类,增加构造方法接收Activity实例,保存为成员变量:
public class DateDialog { // 增加成员变量保存原有Activity实例,替换YourActivityName为你实际的Activity类名 private YourActivityName mActivity; // 修改构造方法接收参数 public DateDialog(YourActivityName activity) { this.mActivity = activity; } public void SetDateString() { String name = "bla bla bla"; // 直接用传入的原有Activity实例调用方法,不要自己new Activity mActivity.setdate(name); } }
- 修改Activity中初始化DateDialog的代码,传入当前Activity实例:
protected void onCreate(Bundle savedInstanceState) { date = findViewById(R.id.date_input); date.setOnClickListener(this); // 初始化时传入当前正在运行的Activity实例(this就是当前Activity) date_class = new DateDialog(this); // ........其他原有代码 }
补充优化:如果担心持有Activity实例导致内存泄漏,可以用弱引用包裹Activity实例:
public class DateDialog { private WeakReference<YourActivityName> mActivityRef; public DateDialog(YourActivityName activity) { this.mActivityRef = new WeakReference<>(activity); } public void SetDateString() { YourActivityName activity = mActivityRef.get(); if (activity != null) { String name = "bla bla bla"; activity.setdate(name); } } }
内容的提问来源于stack exchange,提问作者Chris Ed
相关产品推荐
相关产品推荐

