Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android onCreateView中片段null中的参数_Android_Android Fragments_Serializable - Fatal编程技术网

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()