onCreateView 中 Fragment 中的参数 null

Argument in Fragment null in onCreateView

在我的 Activity 中,我开始 FragmentTransaction 并将 Argument 设置为我的 Fragment

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

在我的 Fragments class 中,我覆盖了 setArgument 方法并解析了 Serializable 对象:

Product product;

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

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

所有这些都工作正常,但是一旦我在我的 onCreateView() 方法中进行调试,之前设置的产品就是 null。有人可以向我解释一下吗?正确的做法是什么?

编辑:

根据 Michael 的回答,我得到了以下代码片段: 在 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;
    }

但是当我尝试访问 onCreate() 内的 getArgument() 时,它会给出 null:

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

而我的 Product 从未设置。我还漏掉了什么吗?

您应该在 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);
}

}

参数在片段构造函数中设置,并在 onCreate 中撤回,因为 onCreate 在片段生命周期中 onCreateView 之前被调用,您将能够访问这些参数在 onCreateView 及以后。

有同样的问题。我的代码的问题是参数被设置了两次 (bundle.setArguments()) - 一次来自 activity 并且在片段启动期间再次设置,我将它发送到 newInstance() 并执行 bundle.setArguments() 再次。发生的情况是,当流进入 onCreate() 或 onCreateView() 时,参数被覆盖并且捆绑包中获取的数据丢失。

希望这对您有所帮助。 :)