【问题标题】:Android getActivity() always returns null inside fragmentAndroid getActivity() 总是在片段内返回 null
【发布时间】: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: BackStackEntry{41f9bd60}
`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 FragmentMyProfile{41f9bc20 id=0x7f070126}
04-08 18:44:05.950: V/FragmentManager(16280): Setting back stack index 0 to BackStackEntry{41f9bd60}
04-08 18:44:05.950: V/FragmentManager(16280): Run: BackStackEntry{41f9bd60 #0}
04-08 18:44:05.950: V/FragmentManager(16280): Bump nesting in BackStackEntry{41f9bd60 #0} by 1
04-08 18:44:05.950: V/FragmentManager(16280): Bump nesting of FragmentMyProfile{41f9bc20 id=0x7f070126} to 1
04-08 18:44:05.950: V/FragmentManager(16280): add: FragmentMyProfile{41f9bc20 id=0x7f070126}
04-08 18:44:05.950: V/FragmentManager(16280): Allocated fragment index FragmentMyProfile{41f9bc20 #0 id=0x7f070126}
04-08 18:44:05.950: V/FragmentManager(16280): moveto CREATED: FragmentMyProfile{41f9bc20 #0 id=0x7f070126}
04-08 18:44:05.950: V/FragmentManager(16280): moveto ACTIVITY_CREATED: FragmentMyProfile{41f9bc20 #0 id=0x7f070126}
04-08 18:44:05.990: V/FragmentManager(16280): moveto STARTED: FragmentMyProfile{41f9bc20 #0 id=0x7f070126}
04-08 18:44:06.030: V/FragmentManager(16280): moveto RESUMED: FragmentMyProfile{41f9bc20 #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() 会给您一个参考。

标签: android android-fragments fragment android-fragmentactivity


【解决方案1】:

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

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

【讨论】:

  • 这解决了我的问题。我在使用 Holo Everywhere 时使用 getSupportActivity() 而不是 getActivity()。仍然不太清楚为什么 getActivity() 在第一次加载片段时工作,但不是当我导航离开然后返回时......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
  • 2014-02-03
  • 2014-12-27
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
相关资源
最近更新 更多