我有一个包含3个片段的ViewPager。所有3个片段具有相同的类型,具有相同的布局,但它们用于保存不同的(文本)信息。我正在尝试创建我的活动,在那里我创建片段并准备我将填充片段的文本数据。但是,我似乎无法使用我的活动中的碎片。所有活动的生命周期方法都在片段生命周期方法之前执行。因此,如果我尝试从我的活动中更新片段中的textview,它将无法工作,因为片段中的textview为null。
我将需要定期更新片段,因此不能将数据作为包传递。另外,因为我传递了大量文本,所以我使用的是StringBuilder对象,这不是我可以在一个包中传递的东西(除非我把它变成Parcelable,我不想要它)
我想我可以在我的片段类中运行一个在片段创建过程中执行的方法,但这意味着所有3个片段都会运行这个方法。这不是我正在寻找的控制水平。
是否有一种巧妙的方法可以使这项工作?
由于
答案 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
}
我希望这会帮助你。