Fragment - 在onAttach之后,为什么getActivity()会返回null?

4
我有一个管理器类,它是一个保留的片段,并且它持有这些片段的非保留片段和AsyncTasks。
在屏幕旋转后,我希望将新片段与正在运行/已完成的任务链接起来,并使用任务提供的数据更新片段。
现在,在我的保留片段中,我有以下代码:
@Override
public void onAttach(Activity activity)
{
    mFragStatePagerAdapter.update(activity.getSupportFragmentManager());
    
    Debugger.Debug(DEBUG, getClass(), "ON_ATTACH_0: parentActivity: {" + 
        (activity != null ? activity.hashCode() : "NULL") + "}");

    for (int i = 0; i < mFragStatePagerAdapter.getFragmentListSize(); i++)
    {
        Frag f = mFragStatePagerAdapter.tryGetItem(i);
        
        if (f != null)
            f.onAttach(activity);

        // alternatively I tried following as well
        // if (f != null)
        //     activity.getSupportFragmentManager().beginTransaction().attach(f).commit();
        
        Debugger.Debug(DEBUG, getClass(), "ON_ATTACH_1: this: " + 
            this.hashCode() + " fragment: " + f + ", 
            parentActivity: {"+ (f.getActivity() != null ? f.getActivity().hashCode() : "NULL") + "}");
    }
    
    
    for (int i = 0; i < mTasks.size(); i++)  
    {
        if (mTasks.get(i) != null)
        {
            Frag f = getFragment(i);
            mTasks.get(i).attach(f, mTaskCallbacks.get(i));
            if (mTasks.get(i).getStatus() == Status.FINISHED)
                mTasks.get(i).deliverResult();
        }
    }
    
    super.onAttach(activity);
}

解释:

  • Frag... 它是一个扩展了Fragment的类
  • mFragStatePagerAdapter... 它是一个扩展了FragmentStatePagerAdapter的类,具有通过索引获取fragment的功能...

现在我的问题如下(简短的)调试输出:

ON_ATTACH_0: parentActivity: {1123400376}

ON_ATTACH_1: this: 1121944544 fragment: ExerciseViewFragment{42e2da98}, parentActivity: {NULL}

所以,在调用 f.onAttach(activity) 后,为什么 f.getActivity() 返回null呢?我没有在我的扩展Fragment类中重写 onAttach,所以这不可能是原因...


我认为您不应该自行调用“f.onAttach(activity);”。 - njzk2
我添加了一个备选方案,因为这让我想到了另一个想法:使用 activity.getSupportFragmentManager().beginTransaction().attach(f).commit(); 代替它...但不幸的是,它也没有起作用...所以如果不能像那样使用 onAttach,我该怎么实现我的目标呢?片段应该再次附加到新活动中...这样我就可以更新我的片段数据了... - prom85
1
你的适配器实现有些可疑,因为如果这些片段是当前在ViewPager中可见的片段,它们应该具有有效的活动引用(自己调用onAttach是错误的)。无论如何,与其让保留的片段尝试向其他片段发送数据,为什么不将其作为一个简单的数据持有者,并让其他片段直接从其实现中使用呢? - user
其实,我也考虑过这种方式...现在我有一个保留的片段,它保存了任务,分页器片段查看保留的片段是否存在任务,如果存在任务,则将自己附加到该任务上,或者如果任务已经完成,则使用此任务的数据或创建一个新线程并将其添加到保留的片段中...到目前为止,一切似乎都很顺利...所以感谢您指引我正确的方向...花了整整一天时间编写可重用的pager + pageindicator + fragments管理器,它们在线程中加载它们的数据...现在我有了一些东西,所以谢谢。 - prom85
2个回答

0

我认为你的问题在于调用

super.onAttach(activity);

在你的onAttach方法的末尾。 在这个方法中,将它作为第一件事调用,像这样:

@Override
public void onAttach(Activity activity)
{
     super.onAttach(activity)

     // and here goes your code
     [...]
}

我不再使用这段代码了,但我记得那是必要的。我以前必须这样做。问题不在于保留的片段抛出异常,而是手动添加的片段(您可以在代码中看到)已经被附加,并且直接附加后没有返回它们刚刚被附加到的活动... - prom85

0

这是正确的,但仅适用于使用最新版本的支持库。该问题是在2013年提出的,当时它的运行方式有些不同 :-) - pelotasplus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接