【问题标题】:Why do I get an error of cycling inheritance involving MyFragment?为什么我会收到涉及 MyFragment 的循环继承错误?
【发布时间】:2016-10-14 07:53:06
【问题描述】:

我正在尝试使用接口将数据从活动发送到片段,反之亦然,但遇到涉及 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
  }
}

【问题讨论】:

  • 为什么你的回调变量和你实现的接口不同?

标签: android android-fragments inheritance callback


【解决方案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 接口类文件。

【讨论】:

  • 是的,创建一个单独的接口文件可以正常工作。谢谢
【解决方案2】:

也许你必须为 Activity 这样做

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
}

如果您愿意,您可以将接口的设置器也放入 Fragment 以获得更好的抽象。 你必须注意的是寻找空接口 谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 2021-10-17
    • 2016-04-24
    • 1970-01-01
    • 2012-03-02
    • 2010-12-17
    • 2020-11-05
    相关资源
    最近更新 更多