[android 创建Fragment示例传递参数时的注意事项]

来源:互联网 发布:博拉网络股份有限公司 编辑:程序博客网 时间:2024/06/05 16:25

最近做项目时,app打包时,报了一个这样的错误:

Error:Error: This fragment should provide a default constructor (a public constructor with no arguments) (com.xxxx.xxx.activity.test.HisDetailFragment) [ValidFragment]

大概意思就是:这个Fragment应该提供一个默认的构造函数。

我的项目大概是这样的,在创建fragment实例时,做了类似于这样的参数传递:

public MyDocDetailFragment(String doctor_id) {        this.doctor_id = doctor_id;    }

一查看,确实缺少一个空的构造函数。那缺少我就添加上呗。结果添加上后,再次打包(debug运行不报错),还是打包失败,结果又提示了一个如下的错误:

Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead

大概意思是:使用默认构造函数外加setArguments(Bundle)来代替,去Android的官网上查看Fragment的例子都是下面这个样子的

 /**      * Create a new instance of MyFragment that will be initialized      * with the given arguments.      */      static MyFragment newInstance(CharSequence label) {          MyFragment f = new MyFragment();          Bundle b = new Bundle();          b.putCharSequence("label", label);          f.setArguments(b);          return f;  

那么我就按照这样去传递参数,试试。而不是像之前

public MyDocDetailFragment(String doctor_id) {        this.doctor_id = doctor_id;    }

那样,去传递参数。


首先把之前的替换成这样的方式:

public static MyDocDetailFragment newInstance(String doctor_id) {        MyDocDetailFragment fragment = new MyDocDetailFragment();        Bundle bundle = new Bundle();        bundle.putString("doctor_id", doctor_id);        fragment.setArguments(bundle);        return fragment;    }

我们把参数set到了Arguments中,然后在fragment的 onCreateView 方法中,取出该参数就可以啦,如下:

@Override    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {        Bundle args = getArguments();        if (args != null) {            info_id = args.getString("doctor_id");        }        view =inflater.inflate(R.layout.fragment_inf_detail, null);        return view;    }

最后在,创建该fragment实例的Activity中,直接调用newInstance()这个静态方法就可以啦。如下:

MyDocDetailFragment fragment=MyDocDetailFragment.newInstance(doctor_id);

这样同样也完成了,参数的传递。此时,我再次打包我的apk,就成功了!

但是有时我们传递的一些数据,Bundle不好储存,怎么办呢?我尝试这样去处理也是可以的。如下:

public static MyDocDetailFragment newInstance(JSONArray data, String doctor_id1) {        MyDocDetailFragment fragment = new MyDocDetailFragment();        mData= data;        doctor_id = doctor_id1;        return fragment;    }

声明 静态的 mData变量和doctor_id变量,直接将传递过来的数值将其赋值就行啦。

如果你觉得对你有用,就给个赞吧!

阅读全文
0 0
原创粉丝点击