【问题标题】:The life cycle of Fragment in AndroidAndroid中Fragment的生命周期
【发布时间】:2012-11-28 02:09:18
【问题描述】:

我问了一个关于 Fragment 初始化的问题并发布了我的代码(Delay initialization when using Fragment in Android)。问题解决了。但我的问题仍然存在。当我调用onLoad() 来获取变量时,它会抛出NullPointerException。我在onCreateView() 中初始化这些变量。所以我猜生命周期结束了。我在这些函数中记录了 A.java 中的信息:onDestroyonDestroyViewonStoponDestroyViewonStop 被调用,而 onDestroy 不是当片段 A 更改为另一个时。奇怪:

片段A中有一个EditText。我输入了一个字符串abc。 1、如果生命周期结束,那么当我将片段从A更改为另一个然后再更改回A时,输入应该为空。但事实并非如此。 2、如果生命周期没有结束,为什么我拿不到变量?

那么有什么可以保存abc 的地方吗?那是什么?在哪里?

看来我不能在 Fragment 中延迟初始化。我无法获取非静态变量。

Code:
/** super class of Fragment */
public class BaseFragment extends Fragment {
    public void onLoad(Context context){
    }
}

/** */
public class AFragment extends BaseFragment{
    TextView name;
    @Override
    public View onCreateVew(...){
        name = new TextView(..);
    }
    @Override
    public void onLoad(Context context){
         // here will throw NullPointerException
         name.setText("=========");
    }
}


public class TabsAdapter extends FragmentPagerAdapter implements TabHost.OnTabChangeListener,ViewPager.OnPageChangeListener {
    ....
    @Override
    public Fragment getItem(int position) {
        TabInfo info = mTabs.get(position);
        return Fragment.instantiate(mContext, info.mClss.getName(), info.mArgs);
    }

    @Override
    public void onPageSelected(int position) {
        TabWidget widget = mTabHost.getTabWidget();
        int oldFocusability = widget.getDescendantFocusability();
        widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
        mTabHost.setCurrentTab(position);

        widget.setDescendantFocusability(oldFocusability);

        BaseFragment f = (BaseFragment) getItem(position);
        f.onLoad(mContext);
    }
}

【问题讨论】:

  • 你能把你得到NullPointerException的堆栈跟踪连同代码一起发布吗?
  • @antew 完成了!你可以检查一下。

标签: android android-fragments android-viewpager


【解决方案1】:

但我的问题仍然存在。当我调用 onLoad() 来获取 变量,它会抛出 NullPointerException。我初始化这些 onCreateView() 中的变量。

问题在于您处理这些片段的方式。更准确地说,在onPageSelected 方法中,您调用FragmentPagerAdaptergetItem() 方法来查找该位置的片段(或者这就是我认为您正在尝试做的事情)。但是每次调用这个方法时只是实例化一个新片段,它不会为您提供对该位置的ViewPager 片段的引用。这个新实例化的片段没有附加到Activity,它的onCreateView 方法没有被调用,所以它没有创建任何视图。尝试使用 onLoad 方法访问其中一个视图是错误的,它会抛出 NullPointerException。您应该尝试使用上一个答案中的代码,因为该代码将尝试查找 ViewPager 实例化的片段,并通过 FragmentManager 用作其页面。

【讨论】:

  • 我也有这个“消失”变量的问题,甚至 getactivity() 返回 null。但是我不会为 viewPager 中的每个 TAB 多次调用 getItem,因为这将替换 Luksprog 正确指出的片段实例。所以因此问题是这样的:为什么片段实例仍然会丢失它的变量集,因为看起来,一个新的片段实例已经“接管”了选项卡?是不是 viewPager/FragmentPagerAdapter 内部的某些东西导致了这种情况?
  • 抱歉,我今天早些时候在 getActivty 上提出的问题返回 null 并且可能受到相同的综合症的影响,可以在这里找到:stackoverflow.com/questions/22245048/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多