2017-04-25 4 views
0

私のActivityの中で私はFragmentTransactionを開始し、ArgumentFragmentに設定します。私は私のonCreateView()メソッド内でデバッグしていますように、とすぐにonCreateViewのフラグメントヌルの引数

Product product; 

@Override 
public void setArguments(Bundle args) { 
    super.setArguments(args); 

    product = (Product) args.getSerializable(Constants.KEY_PRODUCT); 
} 

このすべてが正常に動作している、しかし:私のFragmentのクラスの中で

DetailFragment detailFragment = new DetailFragment(); 
Bundle bundle = new Bundle(); 
bundle.putSerializable(Constants.KEY_PRODUCT, navigate.product); 
detailFragment.setArguments(bundle); 

私はsetArgumentメソッドをオーバーライドしてSerializableオブジェクトを解析します以前に設定された製品は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; 
    } 
私は次のコードの断片になってしまったマイケルによって解答後

EDIT

しかし、のgetArgument()にアクセスしようとするとtはnullを与える:

if (getArguments() != null) { 
    product = (Product) getArguments().getSerializable(Constants.KEY_PRODUCT); 
} 

と私のProductが設定されることはありませんが。私は別のことを忘れましたか?

答えて

1

getArgumentsonCreateに電話する必要があります。

のAndroid Studioのプロジェクトに新しいフラグメントを追加するときには、生成されたコードを見ると:引数はbefreと呼ばれる断片のコンストラクタで設定されているとonCreate以来onCreateに出て引き戻され

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

} 

onCreateViewのフラグメントライフサイクルでは、これらの引数にはonCreateView以降でアクセスできます。

+0

なぜ 'product'は' setArguments() 'で初期化されたときに' null'になっていますか? – azizbekian

+0

@azizbekian 'Fragment'が' FragmentManager'にまだ追加されていないので、 'null'が出ています。' FragmentManager'は、状態を持つフラグメントを削除して再作成できます。 'setArguments()'の 'product'を設定するコンストラクタは、コンストラクタを使うことと変わりませんが、' Bundle'には 'getArguments()'が返す 'product'があります。 – Kostyantin2216

+0

@ Kostyantin2216、私はget/set引数のポイントを得る。私が答えることができなかった問題は、まだそのシステムによって破壊されていなかったので、そのフラグメントが「無効」になっている理由です。これがシナリオで、システムがプロセスを殺してユーザーが戻ってきたら、 'product'フィールドはnullにする必要がありますが、そうでなければ' Bundle'がどこにどこにあるのか(ソースでさえも)ヌルになった。 – azizbekian

関連する問題