在我的FragmentTransaction
中,我开始Argument
并将Fragment
设置为DetailFragment detailFragment = new DetailFragment();
Bundle bundle = new Bundle();
bundle.putSerializable(Constants.KEY_PRODUCT, navigate.product);
detailFragment.setArguments(bundle);
。
Fragment
在我的Serializable
类中,我重写了setArgument方法并解析了Product product;
@Override
public void setArguments(Bundle args) {
super.setArguments(args);
product = (Product) args.getSerializable(Constants.KEY_PRODUCT);
}
对象:
onCreateView()
所有这一切都运行良好,但只要我在null
方法中进行调试,之前设置的产品就是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;
}
在片段中:
getArgument()
但是当我尝试访问onCreate()
中的null
时,它会给if (getArguments() != null) {
product = (Product) getArguments().getSerializable(Constants.KEY_PRODUCT);
}
:
Product
我的<div class="row">
<div class="col-xs-12">
<table id="tabla-recibos" class="table table-hover dataTable">
<thead>
<tr>
<!-- <th style="display:none;"><span data-translate="global.field.id">Id</th> -->
<th><span data-translate="webclientesApp.recibo.numRecibo">Núm. de póliza</th>
<th><span data-translate="webclientesApp.recibo.numPoliza">Expediente</th>
<th><span data-translate="webclientesApp.recibo.importe">Nombre del tomador</th>
<th><span data-translate="webclientesApp.recibo.fechaPago">Nombre del asegurado</th>
<th><span data-translate="webclientesApp.recibo.estado">Estado</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
永远不会被设置。我错过了别的什么吗?
答案 0 :(得分:1)
您应该在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
在片段生命周期中被称为befre onCreateView
,您将能够在onCreateView
中访问这些参数{1}}以及之后。
答案 1 :(得分:0)
有同样的问题。我的代码的问题是参数设置了两次(bundle.setArguments())-一次是从活动中进行的,另一次是在片段启动期间的,在该过程中,我在newInstance()中将其发送并再次执行bundle.setArguments()。发生的情况是,当流进入onCreate()或onCreateView()时,参数将被覆盖,并且捆绑在一起的数据将丢失。
希望这会有所帮助。 :)