【发布时间】:2012-11-28 02:09:18
【问题描述】:
我问了一个关于 Fragment 初始化的问题并发布了我的代码(Delay initialization when using Fragment in Android)。问题解决了。但我的问题仍然存在。当我调用onLoad() 来获取变量时,它会抛出NullPointerException。我在onCreateView() 中初始化这些变量。所以我猜生命周期结束了。我在这些函数中记录了 A.java 中的信息:onDestroy、onDestroyView、onStop。 onDestroyView 和 onStop 被调用,而 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