使用hashmap避免片段重新创建

时间:2014-07-04 12:54:42

标签: android android-fragments

我有一个处理5个片段的Activity。每次活动替换每个片段onCreate和onCreateView都被调用。为了避免这种情况,我创建了一个HashMap,用于存储每个片段。在活动替换片段之前,如果此片段已存在,则检查散列映射。如果存在,则将旧片段替换为映射中的实例。在其他情况下,它会对片段进行实例化,之后它会替换旧的片段。

尽管我在hashmap上找到它时避免了片段的实现,但仍在调用onCreate和onCreateView。我怎么能避免这个?有没有其他方法可以实现我的目标?

3 个答案:

答案 0 :(得分:0)

首先,HashMap没有用于保存片段的引用。您可以在添加/替换它时将标记设置为片段。查看FragmentTransaction.add(int, Fragment, String)FragmenTransaction.replace(int, Fragment, String)方法。如果为标记提供唯一的字符串,则可以使用FragmentManager.findFragmentByTag(String)方法检索片段。 Fragment引用的容器是多余的。

要点: 如果使用replace / add方法显示Fragment,则调用onCreate()和onCreateView()。要避免onCreate()调用,您只需附加和分离片段即可。这样只会调用onCreateView()。但是 可能会阻止onCreateView()调用。

也许用你想要实现的一些细节更新你的问题,因为这听起来你完全走错了路。

答案 1 :(得分:0)

你的目标不是很清楚。

当你处理片段时,请记住你对生命周期的控制是有限的,你只能扩展(系统控制)对象。您可以在此处阅读片段的生命周期:Creating a Fragment

假设您的目标是在5个活动片段之间切换,我可以考虑两个选项:

选项1:设计片段,以便快速重新创建,将数据保存在其他位置,并将其提供给片段,片段只显示数据。

选项2:android支持库有两个片段适配器,FragmentPagerAdapterFragmentStatePagerAdapter。第一个是将片段保存在内存中的适配器。

答案 2 :(得分:-1)

  

我该如何避免这种情况?有没有其他方法可以实现我的目标?

如果您真的想避免重新创建活动实例,请再次使用android:launchMode="singleTop"

示例:

<activity
        android:name=".YourActivity"
        android:label="SomeLabel"
        android:launchMode="singleTop">
</activity>

来自开发者文档,

  

如果活动的实例已存在于目标的顶部   任务,系统通过调用将意图路由到该实例   它的onNewIntent()方法,而不是创建一个新的实例   活性。

来源:http://developer.android.com/guide/topics/manifest/activity-element.html