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);
在我的 Fragment
s 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() 时,参数被覆盖并且捆绑包中获取的数据丢失。
希望这对您有所帮助。 :)
在我的 Activity
中,我开始 FragmentTransaction
并将 Argument
设置为我的 Fragment
。
DetailFragment detailFragment = new DetailFragment();
Bundle bundle = new Bundle();
bundle.putSerializable(Constants.KEY_PRODUCT, navigate.product);
detailFragment.setArguments(bundle);
在我的 Fragment
s 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() 时,参数被覆盖并且捆绑包中获取的数据丢失。
希望这对您有所帮助。 :)