1

使用 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()

4

1 回答 1

0

onAttach()在提交片段事务之前不会调用。在那之前,片段没有对创建的引用,Activity除非您将这样的引用传递给它。传递该引用可能是实现您正在尝试做的最干净的方法。

通常在 Android 中,标题由包含的活动决定,而不是片段。例如,aPreferenceActivity的 xml 头文件列出了标题及其相关的片段;这些标题不会出现在 .xml 使用的首选项 xml 文件中PreferenceFragment

于 2013-05-30T06:57:53.537 回答