2015-03-13 236 views
0

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

我将需要定期更新片段,因此将数据作为一个包传递不是一个选项。另外,因为我传递了很多文本,所以我使用了一个StringBuilder对象,这不是我可以通过的一个包(除非我使它可以Parcelable,我不想要)

我想我可以从我的片段类中运行一个方法,这个方法可以在片段创建期间执行,但这意味着所有3个片段都会运行此方法。这不是我正在寻找的控制级别。

有没有一种简洁的方式来完成这项工作?

感谢

回答

1

保持对你的片段的引用,让他们全部实现一个通用的更新方法的接口。作为一个例子,让我们把它超清晰,并与所谓的“更新”一个方法调用接口Updatable:现在

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

,在活动的onCreate,引用保存到您的Updatables存在(即当你查找或实例化片段)。 现在应该在活动中根据需要更新碎片。不用说,更新代码的片段实现需要执行TextView的实际更新。

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

+0

第一个必要的步骤是在创建活动或至少恢复活动时更新片段。尽管如此,没有任何片段的字段被初始化。 – Vas 2015-03-13 18:26:21

+0

我重组了一些逻辑后,最终使用了接口。谢谢! – Vas 2015-03-17 20:33:24

0

您应该考虑使用Observer模式...有一个真正伟大的实现,你可以包括如gradle这个依赖所谓EventBus: https://github.com/greenrobot/EventBus

+0

我按照指示,但碎片正在注册后第一个事件发布(我在我的活动onResume) – Vas 2015-03-13 18:11:03

+0

你应该使用postSticky而不是后 - 这种方式片段将收到粘性事件,只要你注册它到事件总线 – kjurkovic 2015-03-14 23:52:36

0

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

在你的应用类中创建一个新的总线

Bus bus = new Bus(); 

创建一个包含你的数据,你会传递给片段的事件。

bus.post(new MyDataEvent(data)); 

注册您的片段在片段的的onResume()(不要忘了在片段的的onPause()来注销)

bus.register(this); 

并获得与您的片段订阅数据

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

我希望这会帮助你。