片段 - getActivity()如何在onAttach之后返回null

时间:2013-07-18 16:16:31

标签: android android-activity fragment

我有一个管理类,它是一个保留的片段,它不保留这些片段的保留片段和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,具有按索引获取片段的功能......

现在我的问题是关注(缩短)调试输出:

  

ON_ATTACH_0:parentActivity:{1123400376}

     

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

那么为什么在调用f.onAttach(activity)后,f.getActivity()会返回null吗?我没有在我的扩展片段类中覆盖onAttach,所以这不是原因......

2 个答案:

答案 0 :(得分:0)

根据https://developer.android.com/reference/android/support/v4/app/Fragment.html#getActivity()

的文档 如果片段与Context相关联,则

getActivity()可能返回null。

根据此文档https://developer.android.com/reference/android/support/v4/app/Fragment.html#onAttach(android.app.Activity),我们已弃用onAttach(Activity activity),因此请改用onAttach(Context)

答案 1 :(得分:0)

我认为你的问题在于调用

super.onAttach(activity);

onAttach方法的最后。 将其称为此方法中的第一件事,如下所示:

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

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