2013-07-03 62 views
0

我需要將包含方法和字段的複雜對象傳遞給Fragment。複雜的對象實現了一個接口IComplexObject,然後由Fragment調用,所以在我的Fragment中,複雜對象本身是不可見的。使用複雜對象進行片段初始化

對於創建片段我用下面的代碼,通過this post啓發的實例:

public class SimpleContentFragment extends Fragment { 
    private IComplexObject complexObject; 

    protected static SimpleContentFragment newInstance(IComplexObject complexObject) { 

     SimpleContentFragment f = new SimpleContentFragment(); 
     f.complexObject = complexObject; 

     return f; 
    } 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     complexObject.doSomeThings(); 
    } 

} 

一般情況下會像預期,但是,在某些情況下,當我嘗試從片段的onCreateView我得到訪問complexObject一個NullPointerException。

我僅在一些較舊的設備和某些Kindle設備上遇到此異常。

任何想法我做錯了什麼?我如何將對象傳遞到我的片段?

+0

使接口'IComplexObject'擴展'Parcelable'。 –

回答

1

它發生因爲您的片段可以完全重新創建(例如在方向更改期間),這就是爲什麼您有新的片段對象,所有字段均爲null。

馬克,如果你反對爲Parcelable你的對象將不利於包含其他對象,哪些類是不是你的控制之下(例如庫中的類)

你應該看看setRetainInstance方法的一面。我會幫你的。

+0

謝謝,潛水員。在我的Manifest中,我有。這不等同於setRetainInstance嗎?關於Parcelable我還沒有得到它的工作呢...... –

+0

不一樣,如果你說你複雜的對象有時會變爲null。你嘗試過setRetainInstance嗎?它肯定會幫助保存碎片對象。 – Divers

+0

我已從清單中刪除orientationChanges並將setRetainInstance添加到碎片的構造器。在我的測試設備上這可以工作。但是,我無法重現NullPointerException異常,所以我將知道這是否在第一次用戶升級後起作用,並且我沒有通過ACRA接收異常報告,我會通知您。 –

1

1-使您的IComplexObject Parcelable。
看到這些實施例123

2-但是您的對象在片段上ARGS的onCreate(

protected static SimpleContentFragment newInstance(IComplexObject complexObject) { 

     SimpleContentFragment f = new SimpleContentFragment(); 

     Bundle args = new Bundle(); 
     args.putParcelable("key_complexObject", complexObject); 
     f.setArguments(args); 

     return f; 
} 

3-)函數獲得您的對象形式ARGS

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Bundle bundle = getArguments(); 
    this.complexObject = bundle.getParcelable("key_complexObject"); 
} 
+0

感謝您的提示,我會稍後再試!無論如何,我不明白爲什麼我的方法在大多數情況下工作,並且只是有時會失敗...... –

+0

如果您的複雜對象包含不可檢視的項目,比如聽衆? – user3829751