我正在尝试编写一个包含活动的测试应用程序。此活动中有两个片段,这些片段定义为LeftFragment
和RightFragment
。我使用getFragmentManager().findFragmentById()
从彼此片段中获得连接。通过使用该METHODE,我可以从RightFragment
获得LeftFragment
对象,而不能从LeftFragment
获得RightFragment
对象。它只起作用。我这样做,因为我想调用其他片段的某些操作,这些操作返回一些值。我正在考虑使用EventBus,但也失败了。我该如何实现?
这是我的LeftFragment
public class LeftFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
RightFragment rightFragment = (RightFragment) getFragmentManager().findFragmentById(R.id.rightFragment);
if (rightFragment != null){
makeToast(rightFragment.getMessageFromRight());
}else {
makeToast("does not found rightFragment");
}
return inflater.inflate(R.layout.fragment_left, container, false);
}
public String getMessageFromLeft(){
return "Hi! Im left";
}
private void makeToast(String text){
Toast.makeText(getContext(),text,Toast.LENGTH_SHORT).show();
}
}
这是我的RightFragment
public class RightFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
LeftFragment leftFragment = (LeftFragment) getFragmentManager().findFragmentById(R.id.leftFragment);
if (leftFragment != null){
makeToast(leftFragment.getMessageFromLeft());
}else {
makeToast("does not found leftFragment");
}
return inflater.inflate(R.layout.fragment_right, container, false);
}
public String getMessageFromRight(){
return "Hi! Im right!";
}
private void makeToast(String text){
Toast.makeText(getContext(),text,Toast.LENGTH_SHORT).show();
}
}
有很多方法可以在两个片段之间进行交流。如果同时加载了2个碎片。我美国使用以下两种方法之一来做到这一点。
- 您可以使用该链接使用可观察的模式来通信2个片段。
- 您可以使用EventBus Lib进行通信,非常简单
您的问题:
通过使用该方法,我能够从 Rightragment,但不是左右fragment
的Rightragment对象
我认为您的问题是LeftFragment
是先前的实用化,因此您可以从RightFragment
找到它。您的解决方案还可以,使用EventBus
。您需要查看您的代码以找到问题。您可以通过创建其他方法来测试,在初始化2个片段后。
for ex:单击LeftFragment
中的按钮,在RightFragment
中烤消息。
可能发生的事情是,左片段首先获得了otCreateview()调用,此时尚未夸大右片段(因此无法"找到"它由FindFragmentById())。
我建议将引用对其他片段的代码移动到onstart(),而仅将片段夸大()。