如何在活动和片段之间传递对象

Posted

技术标签:

【中文标题】如何在活动和片段之间传递对象【英文标题】:how to pass object between activity and fragment 【发布时间】:2013-06-21 05:00:27 【问题描述】:

请给我一些建议如何在片段和活动之间传递对象。

在我的项目中,有一个 FragmentActivity 用于显示和编辑客户资料。此活动中将包含多个选项卡以显示联系信息、地址...客户信息将作为活动中的一个类预加载。我的问题是如何将此对象传递给每个片段或选项卡?一旦更新,我怎么能传回活动?

我是否必须在我的客户类中实现 Parcelable 接口才能通过捆绑包传递?

每个tab都是动态创建的,可以直接获取fragment实例修改view吗?如果是,一旦选项卡切换,片段是否被破坏?

谢谢

迈伦

【问题讨论】:

根据个人经验,我会说从数据库中重新获取信息,因为您可能会在一个更改数据库的选项卡上创建一个编辑按钮而忘记更新局部变量,从而产生不一致。个人意见。 感谢您的建议。对于我的场景,只有在活动中单击保存按钮时才会保存配置文件。因此,从数据库中临时保存和重新抓取会增加很多额外的工作。 【参考方案1】:

毫无疑问:最好的解决方案是从片段中调用活动方法:

这里是一个位图对象的例子。

在活动中:

定义你的方法:

public Bitmap getMyBitmap() 
    return myBitmap;

在片段中:

1 - 定义您的活动

private Activity_Main myActivity;

2 - 链接您的活动

@Override
public void onAttach(Activity myActivity) 
    super.onAttach(myActivity);
    this.activity= (Activity_Main) myActivity;

3 - 调用你的方法!

myActivity.getMyBitmap()

快速简单!

【讨论】:

这不是最好的解决方案,效率低下,最好使用接口来避免泄漏和内存问题 @PontusBacklund - 抱歉,我不明白“它效率低下”。他正在使用 onAttach() 在片段中添加活动引用。如果他通过简单地 myActivity=null; 在 onDettach() 中删除该引用;不会有泄漏。此外,如果用户需要访问将由应用程序根据当前状态修改的其他对象,我认为这是最好的方法。这也是谷歌开发者推荐的。 @VipinSharma 你能指出 goodle 开发人员实际推荐上述方法的任何示例或文档吗? @user65721 非常抱歉迟到了回复。我检查了developer.android.com/guide/components/fragments.html上给出的代码示例创建活动的事件回调 这是一个糟糕的设计,它破坏了片段的关键作用之一:可被任何类型的活动重用。【参考方案2】:

您需要了解接口如何工作以及如何为片段设置标签以及如何通过标签找到特定片段。你应该阅读这个......

http://developer.android.com/training/basics/fragments/communicating.html

要将对象发送给您的片段,这是基础。在活动中......

        // Create fragment and give it an argument for the selected article
        ArticleFragment newFragment = new ArticleFragment();
        Bundle args = new Bundle();
        args.putInt(ArticleFragment.ARG_POSITION, position);
        newFragment.setArguments(args);

        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

        // Replace whatever is in the fragment_container view with this fragment,
        // and add the transaction to the back stack so the user can navigate back
        transaction.replace(R.id.fragment_container, newFragment);
        transaction.addToBackStack(null);

        // Commit the transaction
        transaction.commit();

在片段上...

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

    ScrollView scroller = new ScrollView(getActivity());
    TextView text = new TextView(getActivity());
    int padding = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
            4, getActivity().getResources().getDisplayMetrics());
    text.setPadding(padding, padding, padding, padding);
    scroller.addView(text);
    text.setText(Shakespeare.DIALOGUE[getShownIndex()]);
    return scroller;

getShownIndex 在哪里......

 public int getShownIndex() 
    return getArguments().getInt("index", 0);

如果你想从片段通信到活动,那么你需要接口。

【讨论】:

我是否需要在我的活动中添加“R.id.fragment_container”来获取每个动态创建的片段的实例?对于接口是可以的,但是如何在activity和fragment之间传递对象呢? R.id.fragment_container 是您的片段容器的 id。它曾经是您活动布局上的 FrameLayout。传递自定义对象的方式相同,但您必须进行序列化或 Parcelable,在此处回答:***.com/questions/10836525/…

以上是关于如何在活动和片段之间传递对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Fragment 之间传递值

如何在导航抽屉活动模板中的片段之间传递字符串变量

如何将值从片段/活动传递到 xml?

如何在导航抽屉中的两个片段之间传递数据

将 Google API 客户端对象从活动传递到滑动选项卡片段

Android:如何在包含其他对象的活动之间传递对象