片段中的参数在onCreateView中为null

时间:2017-04-25 14:48:09

标签: android android-fragments serializable

在我的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> 永远不会被设置。我错过了别的什么吗?

2 个答案:

答案 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()时,参数将被覆盖,并且捆绑在一起的数据将丢失。

希望这会有所帮助。 :)