【问题标题】:In the "ActionBarTabsPager" tutorial, getActivity returns null在“ActionBarTabsPager”教程中,getActivity返回null
【发布时间】:2014-03-07 08:27:24
【问题描述】:

我已经成功实现了教程: http://developer.android.com/reference/android/support/v4/view/ViewPager.html,作为选项卡式浏览器活动,每个选项卡上都有片段。每个 Fragment 都维护着各种 UI 文本字段等,除了 getActivity() 之外,一切都运行良好,它在从任何 Fragment 调用时返回 null。

更新:阅读此内容,然后请在下面查看我自己的答案,以扩大有关此错误原因的范围。续:

但是,空状态会在一段时间后出现。最初,在 fragment.onStart() 中,getActivity() 正在工作,以便可以执行默认的 UI 设置。但是用户第一次进行更改时,getActivity() 已经返回 null。

奇怪的是,在同一时刻,仍然可以从 Activity 对片段 UI 字段进行任何更改,这意味着由于 context=activity 在 setSomeText(this, .. .),这将使片段能够进行相应的更改。当然,设计应该是 Fragment 负责它自己的详细任务。

将上下文保存在 onStart() 中没有帮助,因为该引用将在一段时间后指向 null。

教程中明确指出该功能处于早期开发阶段,但由于这个“null”问题在这里已经成为一个相当大的时间窃贼,而且我看到“getActivity 返回 null”是一个非常常见的问题,我想要大声思考与 ViewPager 和/或 Tab 结合时 getActivity() 中是否存在错误?

我花了这么长时间才发现这个问题是,很难猜测一个片段会永远失去对其活动的了解。无论如何,我正处于下一个障碍,只是想分享这个发现:不要信任 getActivity(),而是将上下文从 Activity 传递到其 Fragments 作为 set/get 方法或其他 api 中的参数。

【问题讨论】:

  • 确保正确处理片段。文档很旧,并且可能没有更新关于该类处于早期开发阶段(经过几年的使用)。如果您有片段的 getActivity() 返回 null 的特定场景,您应该在您的问题中添加一些代码实现以查看发生了什么。

标签: tabs null android-viewpager


【解决方案1】:

这不是一个答案,但我需要解释的空间,我在这个问题中盘旋:

似乎存在比 getActivity() 更普遍的问题。因为片段的变量声明也“消失”为空。片段的新实例已“接管”。当当前选项卡向任一侧移动多个选项卡时,就会发生这种情况。

示例:我定义了 5 个选项卡。我有一个可以从 UI 操作的选项卡 2。在更改 2 个内容后,我在选项卡之间移动,可以通过选项卡单击或手指扫动。无论哪种方式。

结果?只要我访问左侧或右侧的下一个选项卡,然后向后移动,更改的数据仍然存在于选项卡 2 上。只要我将两个或多个选项卡从选项卡 2 移开然后返回,片段实例选项卡 2 始终重置。存在多少选项卡无关紧要。在此过程中我是点击最后一个标签还是第一个标签并不重要。编码?与参考教程中的相同,另外:

//add tabs (notice the once only saving of the fragment into profileViewer)

    mTabsAdapter.addTab(actionBar.newTab()
            //.setText(R.string.action_favorite)
            .setIcon(R.drawable.ic_action_favorite),
            TabFragmentDemo.class, null);

    mTabsAdapter.addTab(actionBar.newTab()
            //.setText(R.string.new_profile)
            .setIcon(R.drawable.ic_action_add_person),
            ProfileViewer.class, null); 
    profileViewer = (ProfileViewer) mTabsAdapter.getItem(NEW_PROFILE);

    mTabsAdapter.addTab(actionBar.newTab()
            //.setText(R.string.action_select)
            .setIcon(R.drawable.ic_action_view_as_list),
            TabFragmentDemo.class, null);

    mTabsAdapter.addTab(actionBar.newTab()
            //.setText(R.string.action_select)
            .setIcon(R.drawable.ic_action_view_as_list),
            TabFragmentDemo.class, null);

    mTabsAdapter.addTab(actionBar.newTab()
            //.setText(R.string.action_select)
            .setIcon(R.drawable.ic_action_view_as_list),
            TabFragmentDemo.class, null);

然后一个简单的dialogFragment选择一个日期然后设置这个日期(没有帮助省略datepicker直接设置一个日期)

 public void showDatePickerDialog(View v) {     

    dateOfBirthPicker = new DateOfBirthPicker();       
    dateOfBirthPicker.show(fragmentManager, datePickerTag); 

}

//the callback from datepicker:
@Override
public void onDateSet(DatePicker view, int year, int month, int day) {
    //update the fragment     
    profileViewer.setCardFromDate (this, day, month, year);

请注意,“this”作为强制上下文传递给片段。这里最大的问题是,只要我的代码中没有任何要求,为什么选项卡会丢失其原始片段?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2013-12-29
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多