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() 的空指针异常