我正在尝试使用接口将数据从活动发送到片段,反之亦然,但是出现了涉及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
}
}
答案 0 :(得分:1)
您收到此错误的原因是因为您的Activity
取决于您的Fragment
和Fragment
取决于您的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中以获得更好的抽象。 你需要注意的是寻找空接口 谢谢