2017-04-25 28 views
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永遠不會設置。我錯過了別的東西嗎?

回答

1

您應該在onCreate中致電getArguments

如果你看一下生成的代碼添加新的片段,以Android Studio中項目時:

public class BlankFragment extends Fragment { 
// TODO: Rename parameter arguments, choose names that match 
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER 
private static final String ARG_PARAM1 = "param1"; 
private static final String ARG_PARAM2 = "param2"; 

// TODO: Rename and change types of parameters 
private String mParam1; 
private String mParam2; 


public BlankFragment() { 
    // Required empty public constructor 
} 

/** 
* Use this factory method to create a new instance of 
* this fragment using the provided parameters. 
* 
* @param param1 Parameter 1. 
* @param param2 Parameter 2. 
* @return A new instance of fragment BlankFragment. 
*/ 
// TODO: Rename and change types and number of parameters 
public static BlankFragment newInstance(String param1, String param2) { 
    BlankFragment fragment = new BlankFragment(); 
    Bundle args = new Bundle(); 
    args.putString(ARG_PARAM1, param1); 
    args.putString(ARG_PARAM2, param2); 
    fragment.setArguments(args); 
    return fragment; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (getArguments() != null) { 
     mParam1 = getArguments().getString(ARG_PARAM1); 
     mParam2 = getArguments().getString(ARG_PARAM2); 
    } 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    return inflater.inflate(R.layout.fragment_blank, container, false); 
} 

} 

參數在片段構造函數中設置和自onCreateonCreate被拉回了被稱爲befre onCreateView在片段生命週期中,您將能夠在onCreateView及更高版本中訪問這些參數。

+0

這是什麼原因,產品在'setArguments()'中被初始化時被'null'掉了? – azizbekian

+0

@azizbekian由於「Fragment」尚未添加到「FragmentManager」,因此它被「空」出來,而「FragmentManager」可以使用狀態來殺死和重新創建片段,這就是爲什麼我們需要使用參數而不是構造函數,在這種情況下,在'setArguments()'中設置'product'與使用構造函數沒有什麼不同,但是getArguments()會返回'Bundle'中的'product'。 – Kostyantin2216

+0

@ Kostyantin2216,我得到了get/set參數。我無法回答的問題是爲什麼這個片段被「空」出來,因爲它尚未被系統破壞。如果這是一個場景,當系統殺死進程,並且用戶導航回來 - 那麼它很好,'產品'字段應該是空的,但否則我不能看到(即使在來源中)如何以及在哪裏'捆綁'空出來。 – azizbekian