【问题标题】:Argument in Fragment null in onCreateViewonCreateView 中 Fragment 中的参数 null
【发布时间】:2017-09-22 15:56:22
【问题描述】:

在我的Activity 中,我开始FragmentTransaction 并将Argument 设置为我的Fragment

DetailFragment detailFragment = new DetailFragment();
Bundle bundle = new Bundle();
bundle.putSerializable(Constants.KEY_PRODUCT, navigate.product);
detailFragment.setArguments(bundle);

在我的 Fragments 类中,我重写了 setArgument 方法并解析了 Serializable 对象:

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;
    }

但是当我尝试访问onCreate() 中的getArgument() 时,它会给出null

if (getArguments() != null) {
     product = (Product) getArguments().getSerializable(Constants.KEY_PRODUCT);
}

我的Product 永远不会设置。我错过了什么吗?

【问题讨论】:

    标签: android android-fragments serializable


    【解决方案1】:

    您应该在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 中撤回,因为在片段生命周期中onCreateonCreateView 之前被调用,您将能够在onCreateView 和更高版本中访问这些参数。

    【讨论】:

    • productsetArguments() 中初始化时被null 淘汰是什么原因?
    • @azizbekian 它正在被null 淘汰,因为Fragment 尚未添加到FragmentManager 中,而FragmentManager 可以杀死并重新创建带有状态的片段,这就是为什么我们需要使用参数而不是构造函数,在这种情况下,在setArguments() 中设置product 与使用构造函数没有什么不同,但您仍然会在Bundle 中拥有productgetArguments() 返回。
    • @Kostyantin2216,我明白了获取/设置参数的意义。我无法回答的问题是,为什么该片段被null 删除,因为它还没有被系统销毁。如果这是一种情况,当系统终止进程并且用户返回时 - 那很好,product 字段应该为空,但否则我看不到(即使在源中)Bundle 的位置和位置987654343@ed out.
    • @azizbekian 但是你又重现了我的问题? @Kostyantin2216 但是为什么在newInstance() 方法中设置了这些参数,我想检索它们?
    • @MichaelStoddart 好的,我现在尝试了这种方法,但getArguments() 也在onCerate() 中提供null。所以这里的基本思想是使用newInstance() 方法传递对象,而不是使用Activity 中的setArguments()
    【解决方案2】:

    有同样的问题。我的代码的问题在于,参数被设置了两次(bundle.setArguments())——一次来自活动,另一次是在片段启动期间,我在 newInstance() 中发送它并再次执行 bundle.setArguments()。发生的情况是,当流进入 onCreate() 或 onCreateView() 时,参数被覆盖,并且包中的数据丢失。

    希望这会有所帮助。 :)

    【讨论】:

      猜你喜欢
      • 2013-03-16
      • 2013-02-18
      • 2014-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      相关资源
      最近更新 更多