【发布时间】:2013-02-04 18:44:46
【问题描述】:
我已经读过这个:http://developer.android.com/guide/components/fragments.html
我正在将一些活动代码移动到一个全新的片段中,但发现之前在 onCreate() 中的代码存在问题。
使用片段的目的:标签。
-
在每个选项卡开关上调用的代码:
FragmentManager fm = getSupportFragmentManager();FragmentTransaction ft = fm.beginTransaction();ft.replace(R.id.tabContent, fragment1);ft.commit();
其中fragment1、fragment2等是activity的实例变量,在onCreate中实例化:
fragment1 = new Fragment1();
//etc.
- 我希望它们如何工作:就像活动 (!),意味着:创建后 - 我调用我的 web 服务,并且列表第一次被初始化,没有更多的初始化,因此,当我切换选项卡时,列表仍然保持我离开它的方式(滚动等),当我回来时,没有视图初始化或 web 服务调用,它只是再次出现。就像在活动中一样,如果我启动另一个活动,然后回来 -
onCreate()将不会被调用,只会调用onResume()。而且由于我只在onCreate()中进行初始化,所以没关系。
我正在调用 onCreate() 一个网络服务来获取数据以填充列表。根据片段的生命周期,有几个候选者可以放置这段代码,但没有一个是完全有效的:
onCreate():在 onCreateView() 之前调用。所以视图层次结构还没有初始化,调用 web 服务是不安全的。
onCreateView():当我切换选项卡/运行显示的代码 sn-p 时总是调用它。
onActivityCreated():我以为在创建 Activity 之后会调用它only,但在 Fragment.onCreateView() 之后它会调用 always
作为一个附带问题,您是否建议在片段中调用 Web 服务?在网上没有找到任何关于此的内容,但不知道为什么它不正确。
提前致谢!
【问题讨论】:
-
没有什么是不正确的,但是既然您在活动中开始使用此代码,为什么不将调用留在活动和片段中,检查数据,如果不存在,请询问获得他们的活动
-
好吧,一方面,因为我认为webservice调用只是fragment的业务,所以为什么不把它放在那里......看不到一个很好的理由让它在活动中(除了“它不起作用”)。另一方面,还不确定在什么时候初始化和填充片段是安全的——但还没有考虑过这种方法。
-
无论如何,您的建议并不能解决
onCreateView()每次切换标签时都会运行的问题。这有一些不良影响,例如重置列表的滚动位置。有没有办法获得与 onCreate() 和 onResume() 相同的功能... -
如果你的数据是依赖的,那么将你的数据放在一个片段中肯定更合理,但你也可以集中你的数据。
onCreateView()每次被调用取决于您的代码,而不是数据的放置位置。无论如何,它可以根据您的代码轻松解决。祝你好运 -
威尔。感谢您的意图,但这些建议有点含糊。目前我在活动中有我的(记忆)数据。在框架中拥有它有什么区别,作为框架可重用模块 - 但原则上与活动(视图+行为)相同?。而
onCreateView()这句话是无法理解的。