尝试使用接口传递数组列表时的空对象引用

时间:2017-07-14 09:21:07

标签: android interface

您好我正在尝试将我的活动中的数组列表传递给片段,这就是我所做的:

FirstActivity:

AdminInterface instanceForInterface;

OnCreate
//
System.out.println(results.size) ; //works fine
instanceForInterface.onDataRecieved(results);  // here I am getting the exception
//

public interface AdminInterface {
    void onDataRecieved(ArrayList <Result> response);
}



public void setInterface(UserFragment anInterface) {
    this.instanceForInterface = anInterface;
}

片段

 OnActivityCreated
((FirstActivity) getActivity()).setInterface(this);

 @Override
public void onDataRecieved(ArrayList<Result> response) {
    processData(response);
}

异常

Attempt to invoke interface method 'void **************.onDataRecieved(java.util.ArrayList)' on a null object reference

我的想法:

我在说这行

instanceForInterface.onDataRecieved(results);

中的

OnCreate()

初始化之前

((FirstActivity) getActivity()).setInterface(this);

中的

OnActivityCreated()

解决方案请??

谢谢

1 个答案:

答案 0 :(得分:1)

问题是您的片段onActivityCreated()方法是在您的活动onCreate()方法之后调用的。

您可以实现所需行为的最小变化是在您的活动中使用onResumeFragments()方法。也就是说,从instanceForInterface.onDataRecieved(results);中删除行onCreate并添加以下代码:

@Override
protected void onResumeFragments() {
    super.onResumeFragments();
    instanceForInterface.onDataRecieved(results);
}
系统会在您的活动onResumeFragments()和您的片段onCreate()方法之后调用

onActivityCreated()

话虽这么说,完全采用不同方法会让你感觉更好。例如,您可以让您的活动公开results的getter并让您的片段检索要使用的结果(而不是让您的活动存储对您的片段的引用)。

进一步阅读活动和片段生命周期: https://developer.android.com/guide/components/activities/activity-lifecycle.html https://developer.android.com/guide/components/fragments.html