【问题标题】:What should i do to make two fragments communicate between each other in mainActivity? [duplicate]我应该怎么做才能使 mainActivity 中的两个片段相互通信? [复制]
【发布时间】:2016-12-03 07:57:01
【问题描述】:

我正在尝试创建一个 memeApp,我创建了两个片段:

  1. 第一个片段有两个EditText 字段,用户在其中写一些东西和一个按钮;
  2. 第二个片段有一张图片,有两个EditText 字段,其中一个位于图片顶部,第二个位于底部。

A 类片段

public class topFragment extends Fragment {
    private static EditText topText;
    private static EditText botText;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.top_sectionfragment, container, false);
        topText = (EditText) view.findViewById(R.id.topText);
        botText = (EditText) view.findViewById(R.id.botText);
        final Button buttonChange = (Button) 
        view.findViewById(R.id.buttonChange);

        buttonChange.setOnClickListener(
            new View.OnClickListener() {
                public void onClick(View v) {
                    buttonClicked(v);
                }
            }
        );


        return view;

        }

        public void buttonClicked(View view) {


        } 

    }

B 类片段

public class bottomfragmentphoto extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.botfragment,container,false);
        return view;
    }
}

我想知道,当我从片段 A 在EditText 中写一些东西时,我该怎么做才能将数据发送到片段 B?而这一切我都想用mainActivity 来完成。

【问题讨论】:

    标签: java android android-fragments


    【解决方案1】:

    没有直接通信的可能,你可以使用这条路线 fragment1->activity->fragment2 通过使用接口或使用更高级别的 startActivityForResult 概念。 在线教程中有很多示例,处理过程很复杂,所以请尝试一下,然后您可以通过发布代码来寻求帮助

    【讨论】:

      【解决方案2】:

      你可以在你的第一个片段中创建一个包,然后用你想要的数据填充它,并将它作为参数传递给你的第二个片段......你可以在那里读取那个包并检索你的数据。

      如果您需要任何示例,请告诉我

      【讨论】:

        【解决方案3】:

        使用 greenrobot 的事件总线 libaray。您可以在片段中注册它,当某些事件发生时将其发布到事件总线,它会通知受尊重的片段或活动,这是library的链接

        将此添加到 gradle

            compile 'org.greenrobot:eventbus:3.0.0'
        

        然后

        将EventBus注册到onResume中的片段或活动,并在onPause中取消注册

        @Override
        protected void onResume() {
            super.onResume();
            EventBus.getDefault().register(this);
        }
        
        @Override
        protected void onStart() {
            super.onStart();
            EventBus.getDefault().unregister(this);
        }
        

        在片段/活动中声明一个在事件发生时将被触发的方法

         @Subscribe(threadMode = ThreadMode.MAIN)
            public void onEvent(SomeEvent someevent) {
        
            }
        

        someevent 可以是任何类的对象

        然后您可以在任何地方使用EventBus 的实例通知事件

        EventBus eventBus = EventBus.getDefault();
        eventBus.post(someEventHasHappend)
        

        这将通知onEvent()

        希望对你有帮助

        【讨论】:

          【解决方案4】:

          除了其他建议,您也可以使用 RxAndroid。在第一个片段中创建一个 Observable 并将其传递给第二个片段,然后在第二个片段中您可以订阅观察者。

          https://code.tutsplus.com/tutorials/getting-started-with-reactivex-on-android--cms-24387

          【讨论】:

            【解决方案5】:

            Afaik,有 2 种方式在 2 个片段之间进行通信:

            1. 通过关联的活动
              Communicating with Other Fragments 官方文档中,它说两个片段不应该直接通信
              要允许 Fragment 与其 Activity 进行通信,您可以在 Fragment 类中定义一个接口并在 Activity 中实现它。 Fragment 在其 onAttach() 生命周期方法期间捕获接口实现,然后可以调用接口方法以与 Activity 通信。阅读documentation了解详情。

            2. 使用事件总线
              您可以使用像EventBus 这样的事件总线架构作为两个片段之间通信的工具。但我不建议这样做,因为片段的性质必须附加到 Activity 并耦合到 Activity。您可以在Communicating with an Event Bus

            3. 阅读更多内容

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多