使用Tabs意味着使用片段,由于某些原因,片段在其生命周期中有新步骤,例如onAttach(Activity)
。
我的片段从资源中填充了一些地图,它是在onAttach()
而不是片段构造函数上完成的;因为在构造函数getResources()
中由于缺少Activity而抛出异常。
片段在MainActivity
上创建,如下所示:
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
switch( tab.getPosition() ) {
case 0:
if( fragmentTab0 == null ) {
fragmentTab0 = new MyFragment();
setTabText(0, ((MyFragment)fragmentTab0).getMyName());
}
fragmentTransaction.add(R.id.fragmentContent, fragmentTab0, "TAB0");
break;
这就是我的问题,在对片段方法getMyName()
的调用中,它使用我之前提到的映射来获取字符串。对getMyName()
的调用是在片段onAttach()
之前执行的,而地图尚未就绪。
我确信我可以找到一种令人费解的方式来获取名称(实际上我已经尝试将活动传递给片段的构造函数并在那里构建了映射,但它起作用,但它违背了片段哲学)。< / p>
我原本认为活动应该在Fragment构造函数中可见,因为片段是根据它们最终附加的活动创建的,所以延迟活动附件是没有意义的。
我也认为new MyFragment()
的调用应在onAttach()
完成后返回。但它在构造函数完成后立即返回。
因此我对这种情况感到不舒服,我想知道我是否以错误的方式使用碎片,如果是这样,那么问题是,我该怎么做才能在那里打电话getMyName()
。
注意:从片段life cycle diagram可以看出,onAttach()
和onDetach()
分别来自onCreate()
和onDestroy()
是不可分割的,因此我怀疑它们是否属于{{1}}和{{1}}真的很有必要。
答案 0 :(得分:0)
onAttach()
。在此之前,片段没有引用创建Activity
,除非您传递这样的引用。传递该引用可能是实现您正在尝试的最简洁的方法。
通常在Android中,标题由包含活动决定,而不是片段。例如,PreferenceActivity
的xml头文件列出了标题及其相关片段;这些标题不会出现在PreferenceFragment
使用的首选项xml文件中。