【问题标题】:Passing complex object from Activity to FragmentDialog and viceversa将复杂对象从 Activity 传递到 Fragment Dialog,反之亦然
【发布时间】:2012-09-25 16:28:55
【问题描述】:

我正在我的活动内的列表视图中实现消息提要。在这个活动中,我只显示消息的“主线程”,而不是对它们的回复,这是一种社交网络行为,当你点击一条消息时,会弹出一个包含该消息及其回复的新窗口。

从网络服务器下载 JSONS 后,我们将信息存储在我们称为 VO 的复杂对象中,即 UserVO,它存储了所有用户的信息。

此对象包含字符串、整数、其他 VO 列表、消息提要列表等...

我的想法是在单击一条消息时在屏幕顶部打开一个新的 FragmentDialog 以显示对该消息的可能回复,并启用发送回复的可能性。

为此,我需要在 Activity 和 Fragment 之间双向传递这些 VO 对象,

  • 从 Activity 到 DialogFragment:带有消息提要的对象。
  • 从 Fragment 到 Activity:一旦用户编写文本并附加图片 (URL),我应该将 Object 发送回 Activity

我已经阅读了很多关于片段和活动的信息,但我仍然找不到对我有用的解决方案。我需要在初始化 Fragment 时传递几个对象,这使用 newInstance() 方法似乎是不可能的。另外,为了使用这种方法,我需要对我们正在使用的所有 VO 进行序列化(复杂)。另外,我仍然需要将片段中的对象(同样是复杂的 VO)传递回活动……有没有办法传递那些大对象?一个接口是否可以双向传递信息?

我真的很感激任何帮助(一些教程会很棒),因为我找不到任何解决这个问题的方法,而且我在这里非常忙碌。

提前致谢!

【问题讨论】:

    标签: android android-fragments android-activity


    【解决方案1】:

    在您的 DialogFragmnet 类中,您创建了两个方法:

    1- newInstance -> 创建 DialogFragment 的实例

    2- setter 设置你的复杂对象

        public class YourDialogFragment extends DialogFragment {
    
            ComplexVariable yourVar;
    
            public static YourDialogFragment newInstance(int arg, ComplexVariable var) {
                YourDialogFragmentfrag = new MoveSongDialogFragment();
                Bundle args = new Bundle();
                args.putInt("count", arg);
                frag.setArguments(args);
                frag.setComplexVariable(var);
                return frag;
            }
    
            public void setComplexVariable(ComplexVariable var) {
                yourVar = var;
            }
        }
    

    然后,显示对话框

    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction ft = manager.beginTransaction();
        Fragment prev = manager.findFragmentByTag("yourTag");
        if (prev != null) {
            ft.remove(prev);
        }
    
        // Create and show the dialog.
        DialogFragment newFragment = YourFragmentDialog.newInstance(argument, yourComplexObject);
        newFragment.show(ft, "yourTag");
    

    【讨论】:

      【解决方案2】:

      您可以将对象保存为 Activity 的成员。为它制作 setter 和 getter。 您可以使用 getActivity() 从 Fragment 访问 Activity 并将 Activity 转换为 YourActivity。

      这是在片段和活动之间传递信息的大体方向。

      【讨论】:

        【解决方案3】:

        Givi 提到的是其中一种方法,但更好、更有效的处理方法可能是使用工厂模式,比如在多个活动中使用 Fragment 的场景中。

        查看如何回答Proper way to give initial data to fragments?

        要了解所有方法,请查看http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity部分

        1. 为活动创建事件回调
        2. Getter 或 Setter
        3. 工厂方法

        对于复杂对象,如果在 Bundle 中传递,请检查此 Passing data of a non-primitive type between activities in android 实现 Paracable 应该可以解决问题

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-09
          • 2010-09-29
          相关资源
          最近更新 更多