gpt4 book ai didi

android - 在 Activity 和 fragment 之间传递数据或行为

转载 作者:太空狗 更新时间:2023-10-29 13:35:24 24 4
gpt4 key购买 nike

我有这样的结构:

Activity A 有一个 ViewPager。 ViewPager 的页面称为 fragment 。

Activity A 有一个复杂对象的列表,我想在页面中显示这些对象。

当用户单击 ViewPager 中的项目时, Activity B 必须启动。 Activity B 也需要包含复杂对象的列表。

所以我必须通过这个列表

A -> fragment -> B

首先,我发现无法使用 fragment 的构造函数将数据传递给它。我必须使用 parcelable 或 serializable。在 fragment 中,我必须再次打包或序列化以传递给 B。

但我不想序列化或打包复杂数据的整个列表 2 次只是为了将其传递给 B。

我想避免使用静态字段。

然后我想到了将监听器传递给 fragment 的想法,该 fragment 监听项目点击,并通知我的 Activity A 和 Activity A 然后使用数据启动 Activity B。这对我来说看起来最干净,因为 A 实际上是数据所属的那个,所以 A 以数据开始 fragment , fragment 返回到 A 然后 A 以数据开始 B。我不必到处传递数据(序列化!)。

但这似乎不起作用,因为我如何使用序列化将监听器传递给 fragment ?在 fragment 中使用监听器返回 Activity 有什么问题?

我该如何解决?

编辑

我在一个关于对话框 fragment 的线程中找到了这个解决方案:Get data back from a fragment dialog - best practices?

@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnArticleSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
}
}

所以我将它添加到我的 fragment 中并使我的 Activity 实现特定接口(interface)。

这将解决将数据从 fragment 传递到 B 的问题。但是我仍然需要将列表从 A 传递到 fragment 。可能我必须使用 Parcelable...

编辑:我试过Parcelable,它有效。但是我列表中的对象在它们之间有很多字段,例如映射。编写 Parcelable 代码(写入/读取)是一种痛苦。也许我只是坚持使用静态数据...

最佳答案

您找到的监听器解决方案非常出色,实际上是 Google 推荐的 (http://developer.android.com/training/basics/fragments/communicating.html)。

至于将数据传递给 fragment 的剩余问题,您确定需要传递整个列表,而不仅仅是 ViewPager 中每个 fragment 的列表元素吗?如果你只需要一个元素,你可以这样做:

    /*
* An adapter for swiping through the fragments we have.
*/
private class CustomPagerAdapter extends FragmentStatePagerAdapter {

List<Thing> things;

public CustomPagerAdapter(FragmentManager fragmentManager, List<Thing> things) {
super(fragmentManager);
this.things = things;
}

@Override
public int getCount() {
return things.size();
}

@Override
public Fragment getItem(int position) {
return ThingFragment.newInstance(things.get(position));
}
}

/*
* Loads a view based on the thing.
*/
private static class ThingFragment extends Fragment {

private String name;

static ThingFragment newInstance(Thing thing) {

ThingFragment f = new ThingFragment();

// add some arguments to our fragment for onCreateView
Bundle args = new Bundle();
args.putString("name", thing.getName());
f.setArguments(args);

return f;
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
name = getArguments().getString("name");
}

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

View v = inflater.inflate(R.layout.thing_fragment_layout, container, false);
TextView t = (TextView)v.findViewById(R.id.thingText);
t.setText(name);
return v;
}
}

并将您的列表传递给适配器。当然,这需要动态创建动态,但膨胀 xml fragment 真的很容易。

如果您确实需要传递整个列表,是的,您可能必须将单个复杂对象设为 Parcelable,然后将其添加到您的 Fragment 参数中,就像使用 Bundle.putParcelableArray() 一样。

关于android - 在 Activity 和 fragment 之间传递数据或行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11134188/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com