Android中片段的生命周期

时间:2012-11-28 02:09:18

标签: android android-fragments android-viewpager

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

片段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);
    }
}

1 个答案:

答案 0 :(得分:0)

  

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

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