【问题标题】:Fragmentation, onRestart(), and Null Pointers -- What am I doing wrong?碎片化、onRestart() 和空指针——我做错了什么?
【发布时间】:2015-04-24 20:27:21
【问题描述】:

我有 3 个片段,它们通过 ViewPager 包含在主要活动中。我正在尝试做的是允许自己从主要活动中的不同生命周期回调(即onRestart())调用这些片段类的对象上的方法,以便我可以通过后端调用刷新它们的内容。更具体地说,其中一个片段包含人们发布的图像的“实时提要”,用户通过其中一个片段访问此发布活动。

现在,我要解决的问题是,当用户转到此发布活动并发布图片时,他们返回的片段中的实时提要没有刷新。为此,我需要从主要活动的onRestart() 调用该片段中的后端和 UI 更新方法。

但是我遇到了这些空指针异常——这是代码在片段中的样子:

  public void refreshUI(){

    activity = getActivity();
    appContext = ThisApp.appContext();
    view = getView();

    peopleHeader = (TextView) view.findViewById(R.id.people_header);
    peopleLinearLayout = (LinearLayout) view.findViewById(R.id.local_people_linearlayout);

    ..... (various other instantiations)... }

NPE 来自 getActivity() 或某些 UI 实例。我从onActivityCreated() 调用此代码,它按预期工作。但是,如果我尝试从onRestart() 再次在我的片段对象上调用此代码,我会崩溃。

发生了什么事?不明白为什么这会对我不利。

非常感谢。

【问题讨论】:

  • 您是在活动 onRestart() 中的片段上调用它吗?
  • 您是否在活动中的某处第一次使用 FragmentTransaction 来创建片段?您是否尝试过替换您的 onRestart() 代码来替换片段再次
  • @McAdam331 -- 是的。我有一个 FeedFragment 对象,因此来自 onRestart() 的调用是 feedFragment.refreshUI() 和 feedFragment.getNewContent()。我只是添加了 refreshUI() 来尝试解决我在 getNewContent() 中需要的明显为空的项目的一些问题。我也没有在任何地方使用 FragmentTransactions。当我第一次创建片段时,这一切都来自 onActivityCreated() 和 onViewCreated()。我使用 ViewPager 进行设置的方式不会在任何地方使用 FragmentTransaction。

标签: android android-fragments android-lifecycle


【解决方案1】:

当您的Activity 被销毁并重新创建时,您的Fragments 也随之被销毁并重新创建。你可以看看Fragment/Activity生命周期解释here

这意味着您保留的引用消失了,Fragment 在那里,但它是另一个对象。您需要获得对这个新对象的引用。

您可以查看this 答案以了解如何执行此操作。它解释了如何获取由 ViewPager 适配器创建的 Fragments 的引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多