Android onCreateView中片段null中的参数
在我的Android onCreateView中片段null中的参数,android,android-fragments,serializable,Android,Android Fragments,Serializable,在我的活动中我开始片段事务,并将参数设置为我的片段 DetailFragment detailFragment = new DetailFragment(); Bundle bundle = new Bundle(); bundle.putSerializable(Constants.KEY_PRODUCT, navigate.product); detailFragment.setArguments(bundle); 在我的Fragments类中,我重写setArgument方法并解析Ser
活动中
我开始片段事务
,并将参数
设置为我的片段
DetailFragment detailFragment = new DetailFragment();
Bundle bundle = new Bundle();
bundle.putSerializable(Constants.KEY_PRODUCT, navigate.product);
detailFragment.setArguments(bundle);
在我的Fragment
s类中,我重写setArgument方法并解析Serializable
对象:
Product product;
@Override
public void setArguments(Bundle args) {
super.setArguments(args);
product = (Product) args.getSerializable(Constants.KEY_PRODUCT);
}
所有这些都可以正常工作,但只要我在onCreateView()
方法中调试,以前设置的产品就为null
。谁能给我解释一下吗?正确的方法是什么
编辑:
根据Michael的回答,我得到了以下代码:
在活动中
:
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);
}
而且我的
产品
从未设置。我还遗漏了什么吗?您应该在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
,因此您将能够在onCreateView
及更高版本中访问这些参数。您应该在中调用getArguments
onCreate
如果在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())——一次是在活动中设置的,另一次是在片段启动时设置的,我在newInstance()中发送参数,然后再次执行bundle.setArguments()。发生的情况是,当流进入onCreate()或onCreateView()时,参数会被覆盖,捆绑包中的数据会丢失
希望这有帮助。:) 也有同样的问题。我的代码的问题是参数被设置了两次(bundle.setArguments())——一次是在活动中设置的,另一次是在片段启动时设置的,我在newInstance()中发送参数,然后再次执行bundle.setArguments()。发生的情况是,当流进入onCreate()或onCreateView()时,参数会被覆盖,捆绑包中的数据会丢失
希望这有帮助。:) 是什么原因导致
product
在setArguments()中初始化时被null
清除
?@azizbekian由于片段
尚未添加到片段管理器
中,片段管理器
可以杀死并重新创建带有状态的片段,这就是我们需要使用参数而不是构造函数的原因,在这种情况下,在setArguments()
中设置product
与使用构造函数没有什么不同,但是在Bundle
中仍然会有product
,该getArguments()
返回。@Kostyanti2216,我得到了get/set参数的要点。我无法回答的问题是,为什么该片段被null
删除,因为它还没有被系统销毁。如果这是一个场景,当系统终止进程,用户返回时-那么这很好,product
字段应该为空,但否则我无法看到(即使在源代码中)该Bundle
是如何以及在哪里被null
删除的。@azizbekian,但是你重新创建了我的问题吗@Kostyantin2216但是为什么在newInstance()
方法中设置了这些参数,我想检索它们?@MichaelStoddart好的,我现在尝试了这种方法,但是getArguments()
也在onCrorate()中传递null
。因此,这里的基本思想是使用newInstance()
方法传递对象,而不是使用活动中的setArguments()
。为什么product
在setArguments()中初始化时被null
清除
?@azizbekian由于片段
尚未添加到片段管理器
中,片段管理器
可以杀死并重新创建带有状态的片段,这就是我们需要使用参数而不是构造函数的原因,在这种情况下,在setArguments()
中设置product
与使用构造函数没有什么不同,但是在Bundle
中仍然会有product
,该getArguments()
返回。@Kostyanti2216,我得到了get/set参数的要点。我无法回答的问题是,为什么该片段被null
删除,因为它还没有被系统销毁。如果这是一个场景,当系统终止进程,用户返回时-那么这很好,product
字段应该为空,但否则我无法看到(即使在源代码中)该Bundle
是如何以及在哪里被null
删除的。@azizbekian,但是你重新创建了我的问题吗@Kostyantin2216但是为什么在newInstance()
方法中设置了这些参数,我想检索它们?@MichaelStoddart好的,我现在尝试了这种方法,但是getArguments()
也在onCrorate()中传递null
。因此,这里的基本思想是使用newInstance()
方法传递对象,而不是使用活动中的setArguments()
。