Android - Bundle savedInstanceState在Fragment onCreate()和onCreateView()中为null

Kul*_*dav 3 android android-fragments

我试图将参数传递给a Fragment.

点击Viewa后Fragment,我将我替换Fragment为另一个并将数据传递给下一个Fragment.

我的点击动作:

public void onClick(View view) {
    Bundle args = new Bundle();
    args.putSerializable("order", orders.get(position));
    OrderDetailFragment orderDetailFragment = new OrderDetailFragment();
    orderDetailFragment.setArguments(args);
    FragmentManager fragmentManager = ((AppCompatActivity) context).getSupportFragmentManager();
    fragmentManager.beginTransaction()
            .replace(R.id.order_activity_content_frame, orderDetailFragment)
            .addToBackStack("orderDetails")
            .commit();
}
Run Code Online (Sandbox Code Playgroud)

但在我的目的地Fragment,savedInstanceState即将来临null.

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

@Override
public View onCreateView(LayoutInflater inflater,
                         ViewGroup container,
                         Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);

    order = (Order) savedInstanceState.getSerializable("order");

    View rootView = inflater.inflate(R.layout.fragment_order_details, container, false);
    TextView date = (TextView) rootView.findViewById(R.id.order_detail_date);
    date.setText((CharSequence) order.getCreatedOn());
    return rootView;
}
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚到底错过了什么?

ear*_*jim 6

savedInstanceState包含保存在数据onSaveInstanceState(),这是你之前调用Activity/ Fragment是越来越由OS杀死(回收例如,或者因为一个方向的改变内存).

打电话getArguments()Bundle你得救setArguments():

order = (Order) getArguments().getSerializable("order");
Run Code Online (Sandbox Code Playgroud)

此外,建议Fragment使用参数实例化的做法是通过静态newInstance()方法,如下所示:

public static OrderDetailFragment newInstance(Order order) {
    Bundle args = new Bundle();
    args.putSerializable(KEY_ORDER, order);
    OrderDetailFragment fragment = new OrderDetailFragment();
    fragment.setArguments(args);
    return fragment;
}
Run Code Online (Sandbox Code Playgroud)

然后你实例化Fragment这样的:

OrderDetailFragment orderDetailFragment = OrderDetailFragment
    .newInstance(orders.get(position));
Run Code Online (Sandbox Code Playgroud)