0

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

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

1 回答 1

0

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

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

于 2012-11-28T06:53:03.287 回答