0
在我的Activity
內我開始FragmentTransaction
並將Argument
設置爲我的Fragment
。片段中的參數null inCreateView
DetailFragment detailFragment = new DetailFragment();
Bundle bundle = new Bundle();
bundle.putSerializable(Constants.KEY_PRODUCT, navigate.product);
detailFragment.setArguments(bundle);
在我Fragment
的課我重寫setArgument方法和解析Serializable
對象:
Product product;
@Override
public void setArguments(Bundle args) {
super.setArguments(args);
product = (Product) args.getSerializable(Constants.KEY_PRODUCT);
}
所有這一切工作正常,但只要我在我的onCreateView()
方法中進行調試時,以前設置的產品是null
。有人可以向我解釋這個嗎?什麼是正確的做法呢?
編輯:
繼邁克爾的答案,我結束了與下面的代碼片段: 在Activity
:
DetailFragment detailFragment = DetailFragment.newInstance(navigate.product);
而在片段:
public static DetailFragment newInstance(Product product) {
DetailFragment fragment = new DetailFragment();
Bundle args = new Bundle();
args.putSerializable(Constants.KEY_PRODUCT, product);
fragment.setArguments(args);
return fragment;
}
但是,當我嘗試訪問getArgument()
內onCreate()
我T將給予null
:
if (getArguments() != null) {
product = (Product) getArguments().getSerializable(Constants.KEY_PRODUCT);
}
我Product
永遠不會設置。我錯過了別的東西嗎?
這是什麼原因,產品在'setArguments()'中被初始化時被'null'掉了? – azizbekian
@azizbekian由於「Fragment」尚未添加到「FragmentManager」,因此它被「空」出來,而「FragmentManager」可以使用狀態來殺死和重新創建片段,這就是爲什麼我們需要使用參數而不是構造函數,在這種情況下,在'setArguments()'中設置'product'與使用構造函數沒有什麼不同,但是getArguments()會返回'Bundle'中的'product'。 – Kostyantin2216
@ Kostyantin2216,我得到了get/set參數。我無法回答的問題是爲什麼這個片段被「空」出來,因爲它尚未被系統破壞。如果這是一個場景,當系統殺死進程,並且用戶導航回來 - 那麼它很好,'產品'字段應該是空的,但否則我不能看到(即使在來源中)如何以及在哪裏'捆綁'空出來。 – azizbekian