Android服务 > 活动 > 带有ViewPager的片段

4

首先,我要声明我已经寻找了三天的问题解决方案,这可能意味着我不是在问正确的问题或者没有使用正确的方法。如果有任何疑问,请指导我正确方向。

以下是情景:我有一个Activity和一个绑定的ServiceService保存一些数据并根据需要进行处理,同时发布带有某些信息的持久(持续)通知。 Activity有三个Fragments在一个ViewPager中显示Service处理的数据。

Fragments是:List Fragment,它显示可用的活动数据条目;Details Fragment,它显示每个数据的详细信息;以及Parameters Fragment,用户可以修改如何处理数据。

[Service] <-> ([Activity] -> [ViewPager([List], [Details], [Parameters])])

一切都运行得很好。我的Activity绑定到ServiceViewPager在此之后创建,然后Fragments通过Interface获取信息。

现在来到有趣的部分...屏幕旋转!

由于Service异步绑定,当用户旋转屏幕时,Fragments不再具有数据,因为Activity正在绑定服务,而它们已经存在且由于ViewPager没有被重新创建。

我一直在尝试找到解决方案,但似乎我没有知识来解决它。我试图使Fragments的静态引用,在服务重新绑定之前设置它们,但是我无法获得稳定的解决方案。

我会在清单中使用android:configChanges,但每个方向都有不同的布局。

如果我的方法不好,请指导我!


1
你可以尝试使用一个无界面的片段来保存你的数据并将服务绑定到它上面。这里有一个很好的教程,它讲解了如何在异步任务中使用无界面片段,但同样的方法也适用于你的情况。这是处理屏幕旋转的推荐方式。 - Naveed
刚刚按照@Kuffs的建议做了,完美无缺!感谢你们的帮助! :) - Santiago G. Marín
无论如何,您可以展示您的代码吗?我正在尝试从一个活动中将接口实现到ViewPager中的一个片段。 - Lion789
@Lion789 对不起,我的回答晚了。如果你仍然需要,我可以通过Dropbox发送文件给你。让我知道一声。 - Santiago G. Marín
2个回答

2
很难在不了解您的代码的情况下提出建议,但是我想大声思考一下...
您是否可以拥有一个“工作片段”,它从未显示过(即无头),并且已设置setRetainInstance(true),因此它不会丢失您设置的任何状态。
您的工作片段将绑定到服务而不是活动,并保持对其的引用。
如果您需要与Activity通信,则可以使用回调来实现。
您的其他片段可以与工作程序通信,而不是与Activity通信。
这个过程基本上使活动成为一个外壳,其中托管了您的其他组件。旋转不会丢失任何数据,因为所有数据都保存在保留的片段中。

太完美了!非常感谢!但愿我几天前就想到这个了。 - Santiago G. Marín
刚刚尝试了这种方法,效果非常好!再次感谢! :) - Santiago G. Marín

0
在屏幕旋转过程中,活动将被完全销毁,使用android:congfigChange是不鼓励的。但是你可以重写saveInstanceState(bundle)方法,在其中保存活动中存在的数据,以便在系统响应屏幕旋转时销毁它,并在稍后通过将bundle传递给activities onCreate(bundle)方法或从restoreInstanceState(Bundle)方法中获取它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接