如何修复尝试在空对象引用上调用接口方法
How to fix Attempt to invoke interface method on a null object reference
我正在尝试在一个片段中实现一个侦听器,让我知道父级内部的数据是否发生变化 activity。
在 MainActiivty 中,我添加了这些代码行:
public ListenFromActivity activityListener;
public void setActivityListener(ListenFromActivity activityListener) {
this.activityListener = activityListener;
}
然后我在 MainActivity 的 onCreate 方法中添加了这些行:
ConnectFragment connectFragment =new ConnectFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame,connectFragment ).commit();
// this for is used to change data for testing
for(int i=0; i<5;i++){
activityListener.doSomethingInFragment(1+"");
}
在 ConnectFragment 中,我首先添加实现了我的接口:
public class ConnectFragment extends Fragment implements ListenFromActivity
然后在 onCreate 方法中我添加了这些行:
((HomeActivity) getActivity()).setActivityListener(ConnectFragment.this);
然后我在我的界面中实现了这个方法
@Override
public void doSomethingInFragment(String str) {
System.out.println(" listener from connectFragment "+ str);
}
最后这是我的界面:
public interface ListenFromActivity {
void doSomethingInFragment(String str);
}
如果在MainActivity的onCreate中直接这样写for循环,会在Fragment的onCreate中调用((HomeActivity) getActivity()).setActivityListener(ConnectFragment.this);
之前执行。因此,activityListener 变量为 null,您将获得一个 null 对象引用。片段交易和使用 activityListener
变量之间应该有延迟。
您似乎在尝试让 Activity 告诉片段有关数据更改的信息。但是你设置它的方式 over-complicating 它。
在您的 MainActivity 中,您似乎已经有了对 ConnectedFragment 的字段引用。在创建片段并使用 FragmentTransaction 添加后,您需要做的就是在 MainActivity 中调用 connectFragment. doSomethingInFragment("string");
。
我通过添加解决了我的问题:
ConnectFragment connectFragment = new ConnectFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame, connectFragment).commit();
setActivityListener(connectFragment); // her i called the setter and i passed the object of ConnectFragment as parameter.
我正在尝试在一个片段中实现一个侦听器,让我知道父级内部的数据是否发生变化 activity。
在 MainActiivty 中,我添加了这些代码行:
public ListenFromActivity activityListener;
public void setActivityListener(ListenFromActivity activityListener) {
this.activityListener = activityListener;
}
然后我在 MainActivity 的 onCreate 方法中添加了这些行:
ConnectFragment connectFragment =new ConnectFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame,connectFragment ).commit();
// this for is used to change data for testing
for(int i=0; i<5;i++){
activityListener.doSomethingInFragment(1+"");
}
在 ConnectFragment 中,我首先添加实现了我的接口:
public class ConnectFragment extends Fragment implements ListenFromActivity
然后在 onCreate 方法中我添加了这些行:
((HomeActivity) getActivity()).setActivityListener(ConnectFragment.this);
然后我在我的界面中实现了这个方法
@Override
public void doSomethingInFragment(String str) {
System.out.println(" listener from connectFragment "+ str);
}
最后这是我的界面:
public interface ListenFromActivity {
void doSomethingInFragment(String str);
}
如果在MainActivity的onCreate中直接这样写for循环,会在Fragment的onCreate中调用((HomeActivity) getActivity()).setActivityListener(ConnectFragment.this);
之前执行。因此,activityListener 变量为 null,您将获得一个 null 对象引用。片段交易和使用 activityListener
变量之间应该有延迟。
您似乎在尝试让 Activity 告诉片段有关数据更改的信息。但是你设置它的方式 over-complicating 它。
在您的 MainActivity 中,您似乎已经有了对 ConnectedFragment 的字段引用。在创建片段并使用 FragmentTransaction 添加后,您需要做的就是在 MainActivity 中调用 connectFragment. doSomethingInFragment("string");
。
我通过添加解决了我的问题:
ConnectFragment connectFragment = new ConnectFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame, connectFragment).commit();
setActivityListener(connectFragment); // her i called the setter and i passed the object of ConnectFragment as parameter.