如何修复尝试在空对象引用上调用接口方法的问题

时间:2019-06-27 16:11:27

标签: android listener

我正在尝试在一个片段中实现一个侦听器,以使我知道父活动内部的数据是否发生更改。

在MainActiivty中,我添加了以下代码行:

public ListenFromActivity activityListener;
public void setActivityListener(ListenFromActivity activityListener) {
    this.activityListener = activityListener;
}

然后我将这些行添加到MainActivity的onCreate方法中:

ConnectFragment connectFragment =新的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);
}

3 个答案:

答案 0 :(得分:1)

如果您直接在MainActivity onCreate中这样编写for循环,它将在Fragment的onCreate中调用((HomeActivity) getActivity()).setActivityListener(ConnectFragment.this);之前执行。因此,activityListener变量为null,并且您将获得一个空对象引用。在片段事务和使用activityListener变量之间应该有一个延迟。

答案 1 :(得分:1)

您似乎正在尝试让Activity告诉Fragment有关数据更改的信息。但是,将其设置的方式使它变得过于复杂。 在您的MainActivity中,看起来您已经有一个对ConnectedFragment的字段引用。您只需要做的就是在创建片段并使用FragmentTransaction添加片段后,在MainActivity中调用connectFragment. doSomethingInFragment("string");

答案 2 :(得分:0)

我通过添加解决了我的问题:

         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.