在活动中的片段之间进行通信

时间:2017-02-24 12:11:01

标签: android android-fragments

我正在尝试编写一个包含活动的测试应用。此活动中有两个片段,分别定义为LeftFragmentRightFragment。我使用getFragmentManager().findFragmentById()来获取彼此片段的连接。通过使用该方法,我可以从LeftFragment获取RightFragment个对象,但不能从RightFragment获取LeftFragment个对象。它只是单向工作。我这样做,因为我想从其他片段调用一些操作,返回一些值。我在考虑使用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 个答案:

答案 0 :(得分:1)

有两种方法可以在两个片段之间进行通信。如果2个片段同时加载。我通常使用以下两种方法之一来完成它。

  1. 您可以使用此link使用可观察的模式来传达2个片段。
  2. 您可以使用EventBus lib进行沟通,这非常简单
  3. 您的问题:

      

    通过使用该方法,我可以从中获取LeftFragment对象   RightFragment,但不是LeftFragment的RightFragment对象

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

    例如:点击LeftFragment中的点击按钮,在RightFragment中举报。

答案 1 :(得分:0)

可能发生的事情是Left Fragment首先获得OnCreateView()调用,此时Right Fragment还没有被充气(因此它不能被发现"通过findFragmentbyId())。

我建议将获取其他片段引用的代码移动到onStart()中,并仅在onCreateView()中对片段进行膨胀。