在活动中之间的碎片之间交流



我正在尝试编写一个包含活动的测试应用程序。此活动中有两个片段,这些片段定义为LeftFragmentRightFragment。我使用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个碎片。我美国使用以下两种方法之一来做到这一点。

  1. 您可以使用该链接使用可观察的模式来通信2个片段。
  2. 您可以使用EventBus Lib进行通信,非常简单

您的问题:

通过使用该方法,我能够从 Rightragment,但不是左右fragment

的Rightragment对象

我认为您的问题是LeftFragment是先前的实用化,因此您可以从RightFragment找到它。您的解决方案还可以,使用EventBus。您需要查看您的代码以找到问题。您可以通过创建其他方法来测试,在初始化2个片段后。

for ex:单击LeftFragment中的按钮,在RightFragment中烤消息。

可能发生的事情是,左片段首先获得了otCreateview()调用,此时尚未夸大右片段(因此无法"找到"它由FindFragmentById())。

我建议将引用对其他片段的代码移动到onstart(),而仅将片段夸大()。

最新更新