在“ActionBarTabsPager”教程中,getActivity返回null

时间:2014-03-07 08:27:24

标签: tabs null android-viewpager

我已成功实施该教程: http://developer.android.com/reference/android/support/v4/view/ViewPager.html,作为Tab'ed viewpager活动,每个标签上都有片段。每个Fragment都维护着各种UI TextFields等,除了getActivity()之外,一切都运行正常,从任何片段调用时返回null。

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

这不是答案,但我需要空间来解释,我正在解决这个问题:

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

示例:我定义了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”作为强制上下文传递给片段。这里的一个重要问题是,只要我的代码中没有任何内容要求,标签会丢失其原始片段吗?