2012-11-28 57 views
0

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

片段A中有一个EditText。我输入一个字符串abc。 1,如果生命周期结束,那么当我将片段从A更改为另一个,然后再更改回A时,输入应为空。但它不是。 2,如果生命周期不结束,为什么我不能得到变量?

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

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

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); 
    } 
} 
+0

你可以发布堆栈跟踪哪里得到'NullPointerException'以及代码? – antew

+0

@antew完成!你可以检查它。 – blackdog

回答

0

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

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

+0

我也有“消失”变量的问题,甚至getactivity()返回null。但是我并不是多次为viewPager中的每个TAB调用getItem,因为这将替换Luksprog正确指出的片段实例。所以问题是这样的:片段实例如何仍然丢失了变量集,因为看起来,一个新的片段实例已经“接管”了选项卡?它是否在viewPager/FragmentPagerAdapter的内部导致了这种情况? – carl

+0

对不起,我今天早些时候提出的关于getActivty的问题返回null,可能会出现同样的症状,在这里找到:http://stackoverflow.com/questions/22245048/in-the-actionbartabspager-tutorial-getactivity-returns-空值 – carl