Android getActivity() 总是在片段内返回 null

Posted

技术标签:

【中文标题】Android getActivity() 总是在片段内返回 null【英文标题】:Android getActivity() always returns null inside fragment 【发布时间】:2013-03-30 12:59:03 【问题描述】:

我遇到了一个奇怪的问题:getActivity() 方法总是在片段内返回 null。我在 onAttach() 和 onCreateView() 完成运行后调用它。

这个片段位于包含片段堆栈的 FragmentActivity() 中,我向其中添加片段的方式是:

(这段代码是从 Fragment Activity() 的 onCreate() 调用的)

SmartFragment fragment;
fragment = (SmartFragment) Fragment.instantiate(this,
fragmentClassName, params);     
mStackOfFragments.add(fragment);
FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
trans.add(R.id.tabcontent, fragment);
trans.addToBackStack(null);
trans.commitAllowingStateLoss();

我希望它足够清楚

编辑 1:

对 getActivity() 的调用:

protected OnDoneListener nDoneListener = new OnDoneListener() 

    @Override
    public void OnDone(final int counter, final String name) 


        if (getActivity() != null)
            ((TabActivity) getActivity()).RunOnUiThread(new Runnable() 

... ...

正在从不同的类调用此回调。

编辑 2:

class MemoryManager()


    private OnDoneListener nDoneListener;

    public void setOnDoneListener(OnDoneListener onDoneListener)
    
    this.onDoneListner = onDoneListener;
    

    public void updateUiOnRequestFinish()
    
      onDoneListener.onDone();
    


MemoryManaget 本身从不同的回调调用 updateUiOnRequestFinish()

编辑 3:

FragmentManager 日志是:

04-08 18:44:05.950: V/FragmentManager(16280): Commit: BackStackEntry41f9bd60
`04-08 18:44:05.950: D/FragmentManager(16280):   mName=null mIndex=-1 mCommitted=false
04-08 18:44:05.950: D/FragmentManager(16280):   Operations:
04-08 18:44:05.950: D/FragmentManager(16280):     Op #0: ADD FragmentMyProfile41f9bc20 id=0x7f070126
04-08 18:44:05.950: V/FragmentManager(16280): Setting back stack index 0 to BackStackEntry41f9bd60
04-08 18:44:05.950: V/FragmentManager(16280): Run: BackStackEntry41f9bd60 #0
04-08 18:44:05.950: V/FragmentManager(16280): Bump nesting in BackStackEntry41f9bd60 #0 by 1
04-08 18:44:05.950: V/FragmentManager(16280): Bump nesting of FragmentMyProfile41f9bc20 id=0x7f070126 to 1
04-08 18:44:05.950: V/FragmentManager(16280): add: FragmentMyProfile41f9bc20 id=0x7f070126
04-08 18:44:05.950: V/FragmentManager(16280): Allocated fragment index FragmentMyProfile41f9bc20 #0 id=0x7f070126
04-08 18:44:05.950: V/FragmentManager(16280): moveto CREATED: FragmentMyProfile41f9bc20 #0 id=0x7f070126
04-08 18:44:05.950: V/FragmentManager(16280): moveto ACTIVITY_CREATED: FragmentMyProfile41f9bc20 #0 id=0x7f070126
04-08 18:44:05.990: V/FragmentManager(16280): moveto STARTED: FragmentMyProfile41f9bc20 #0 id=0x7f070126
04-08 18:44:06.030: V/FragmentManager(16280): moveto RESUMED: FragmentMyProfile41f9bc20 #0 id=0x7f070126
`

在我看来还不错。所以我猜测这个错误与我从回调中调用 getActivity() 的方式有关。

【问题讨论】:

如果您不熟悉 Fragment 生命周期,这才奇怪...developer.android.com/guide/components/… ...还要检查本段之前的几行...您是在 Activity 构造函数中将 Fragment 添加到 Activity 吗?跨度> 你能把代码放在 getActivity() 行吗? Selvin:从您的评论中可以看出这是一个微不足道的问题,我希望您是对的,但您可能不是。我知道这个链接及其内容,但仍然有这个问题 您是否真的阅读了 Selvin 链接的页面? “注意:如果你的 Fragment 中需要一个 Context 对象,你可以调用 getActivity()。但是,请注意只有在 Fragment 附加到一个 Activity 时才调用 getActivity()。...”我不确定您所说的“在”onAttach 和 onCreateView 之后是什么意思,但是在这些方法期间 没有附加片段。尝试从 onActivityCreated 或之后调用 getActivity。另外,是的,请发布您实际调用 getActivity 的位置。 在这种情况下,FragmentManager.enableDebugLogging(true) 是一个救星。寻找任何可能将您的片段移动到 STOPPED 及以后的东西。您的片段肯定没有附加,或者 getActivity() 会给您一个参考。 【参考方案1】:

这个问题可能是使用了“android.app.Fragment”或“android.support.v4.app.Fragment”的getActivity()

如果您使用的是“android.support.v4.app.Fragment”,则需要检查您是否使用了“android.app.Fragment”中的 getActivity,反之亦然。

【讨论】:

这解决了我的问题。我在使用 Holo Everywhere 时使用 getSupportActivity() 而不是 getActivity()。仍然不太清楚为什么 getActivity() 在第一次加载片段时工作,但不是当我导航离开然后返回时......

以上是关于Android getActivity() 总是在片段内返回 null的主要内容,如果未能解决你的问题,请参考以下文章

Android Fragment和Activity的交互介绍

Android (安卓) getContext 和 getActivity的区别

Android 在 Fragment 中使用 getActivity() NullPointException 的思考和解决办法

Android 片段 getActivity() = null

Android - this.cordova.getActivity().getApplicationContext() 的空指针异常

Android Fragment中调用getActivity为null的问题