为什么我收到涉及MyFragment的循环继承错误?

时间:2016-10-14 07:53:07

标签: android android-fragments inheritance callback

我正在尝试使用接口将数据从活动发送到片段,反之亦然,但是出现了涉及MyFragment的循环继承错误。

实现在MyFragment中创建的界面:

public class MyActivity implements OnSendFromMyFragListener {
  OnSendFromMyActivityListener mCallback;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      mCallback.sendFromMyActivity(2);
  }

  @Override
  public void sendFromMyFrag (int a) {
    //do something
  }

  public interface OnSendFromMyActivityListener {
    public void sendFromMyActivity(int b);
  }
}

实现在MyActivity中创建的界面:

public class MyFragment extends Fragment implements OnSendFromMyActivityListener {
  OnSendFromMyFragListener mCallback;

  public interface OnSendFromMyFragListener {
      void sendFromMyFrag(int a);
  }
  @Override
  public void onAttach(Context context) {
      super.onAttach(context);
      try {
          mCallback = (OnSendFromMyFragListener) context;
      } catch (ClassCastException e) {
          throw new ClassCastException(context.toString());
      }
  }

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
  }

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_my, container, false);

    btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    mCallback.sendFromMyFrag(1);
                }
            }
        });
    return view;
  }

  @Override
  public void sendFromMyActivity(int b) {
    //do something
  }
}

2 个答案:

答案 0 :(得分:1)

您收到此错误的原因是因为您的Activity取决于您的FragmentFragment取决于您的Activity。不同意吗?

让我告诉你。想象一下,在你的工作中,你偶然发现了一个编译器:

class A implements B.A {
    interface B {
        void foo1();
    }

    @Override
    public void foo2()
    {
        // do something;
    }
}

现在你知道class A取决于(实现)B.A,所以在你进一步进入class A之前,你会转到class B

class B implements A.B {
    interface A {
        void foo2();
    }

    @Override
    public void foo1()
    {
        // Do Something;
    }
}

现在您看到class B特别依赖于(实现)class A class A.B!你(编译器)做什么?回到class A?但这取决于class B。因此,您会看到这成为一个无休止的循环,从而导致循环依赖,其中您的班级'定义相互依赖。

作为替代方案,您可以创建成员事件侦听器或匿名侦听器。或者如果你不喜欢这两个选项中的任何一个,你也可以为这两个接口中的任何一个创建一个单独的java接口类文件。

答案 1 :(得分:0)

也许你必须为活动

做这件事
public class MyActivity extends AppCompatActivity implements MyFragment.OnSendFromMyFragListener {


public interface OnSendFromMyActivityListener {
    void sendFromMyActivity(int b);
}

OnSendFromMyActivityListener mCallback;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MyFragment myFragment = MyFragment.newInstance();
    //Do the transaction.....
    //And after this

    mCallback.sendFromMyActivity(0);

}

public void setOnSendFromMyActivityListener(OnSendFromMyActivityListener mCallback){
    this.mCallback = mCallback;
}

@Override
public void sendFromMyFrag(int a) {
    //do something
}}        

这是片段

public class MyFragment extends Fragment implements OnSendFromMyActivityListener {
OnSendFromMyFragListener mCallback;

public interface OnSendFromMyFragListener {
    void sendFromMyFrag(int a);
}

public static MyFragment newInstance() {

    Bundle args = new Bundle();
    MyFragment fragment = new MyFragment();
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    try {
        mCallback = (OnSendFromMyFragListener) getActivity();
        ((MyActivity) getActivity()).setOnSendFromMyActivityListener(this);
    } catch (ClassCastException e) {
        throw new ClassCastException(context.toString());
    }
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_place_suggest, container, false);

    view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mCallback.sendFromMyFrag(1);
        }
    });

return view;
}

@Override
public void sendFromMyActivity(int b) {
    //do something
}

如果你想要你可以将接口的setter也放到Fragment中以获得更好的抽象。 你需要注意的是寻找空接口 谢谢