2012-11-28 144 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