从活动中填充片段字段

时间:2015-03-13 16:40:17

标签: android android-fragments

我有一个包含3个片段的ViewPager。所有3个片段具有相同的类型,具有相同的布局,但它们用于保存不同的(文本)信息。我正在尝试创建我的活动,在那里我创建片段并准备我将填充片段的文本数据。但是,我似乎无法使用我的活动中的碎片。所有活动的生命周期方法都在片段生命周期方法之前执行。因此,如果我尝试从我的活动中更新片段中的textview,它将无法工作,因为片段中的textview为null。

我将需要定期更新片段,因此不能将数据作为包传递。另外,因为我传递了大量文本,所以我使用的是StringBuilder对象,这不是我可以在一个包中传递的东西(除非我把它变成Parcelable,我不想要它)

我想我可以在我的片段类中运行一个在片段创建过程中执行的方法,但这意味着所有3个片段都会运行这个方法。这不是我正在寻找的控制水平。

是否有一种巧妙的方法可以使这项工作?

由于

4 个答案:

答案 0 :(得分:1)

保留对片段的引用,让它们都使用通用更新方法实现接口。举个例子,让我们清楚一点,用一个名为'update'的方法调用接口Updatable

public interface Updatable {
    public void update(String text);
}

现在,在Activity的onCreate中,保存对Updatables的引用(即查找或实例化片段时)。 现在,在必要时从活动中更新碎片应该是微不足道的。毋庸置疑,更新代码的片段实现需要对TextView进行实际更新。

如果所有片段的更新实现完全相同,您可以保存一些代码行并创建一个实现Updatable的基类并扩展Fragment。

答案 1 :(得分:0)

您可以在onActivityCreated(Bundle savedInstanceState)期间填充片段字段。

有关片段生命周期的更多信息,请参阅此站点: http://developer.android.com/guide/components/fragments.html

答案 2 :(得分:0)

您应该考虑使用Observer模式...有一个非常棒的实现,您可以将其包含为名为EventBus的gradle依赖项: https://github.com/greenrobot/EventBus

答案 3 :(得分:0)

您可以使用Otto Bus将数据发送到活动中的片段。 http://square.github.io/otto/

在您的应用程序类中创建一个新总线

Bus bus = new Bus();

创建一个事件,其中包含您将传递给片段的数据。

bus.post(new MyDataEvent(data));

在片段中注册你的片段onResume()(不要忘记在你的片段中取消注册onPause())

bus.register(this);

在片段中使用subscribe获取数据

@Subscribe 
public void onDataReceived(MyDataEvent event) {
    // TODO Do what ever you want
}

我希望这会帮助你。