使用 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()
并且地图还没有准备好。我确信我可以找到一种复杂的方式来获取名称(实际上我已经尝试将活动传递给片段的构造函数并在那里构建地图,它可以工作,但它违背了片段的理念)。
我原以为活动应该在 Fragment 构造函数期间可见,因为片段是从它们最终将附加的活动创建的,因此延迟活动附加没有意义。我也会认为调用new MyFragment()
应该在onAttach()
完成后返回。但它在构造函数完成后立即返回。
因此,我对这种情况感到不舒服,我想知道我是否以错误的方式使用片段,如果是这样,问题是,我应该如何正确地打电话才能在getMyName()
那里打电话。
注意:从片段生命周期图中可以清楚地看出onAttach()
和分别与和onDetach()
无法区分,所以我质疑它们是否真的有必要。onCreate()
onDestroy()