美文网首页
Fragment构造函数打包时的踩坑:should provid

Fragment构造函数打包时的踩坑:should provid

作者: M悇芐冋忆 | 来源:发表于2018-03-28 10:22 被阅读47次

    Fragment构造函数打包时的踩坑:should provide a default constructor

    今晚项目上线完成后,准备打个release的线上apk包,结果令人尴尬的事情出现了,丫的居然编译失败了,debug包一直编译正常啊。android studio报错:This fragment should provide a default constructor (a public constructor with no arguments),修改后又报新错误:Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead [ValidFragment]。下面就来具体说一下Fragment打包时报的这两个错误原因以及解决方案。

    报错1:

    This fragment should provide a default constructor (a public constructor with no arguments)

    在打包时出现在这个问题,原因是一定要有一个无参的默认构造函数,如果不写任何构造函数,其实会默认初始化一个无参的构造函数,这时其实是不会报错的。但是一旦写了带参数的构造方法而没有重写无参的构造函数,这时就要打包编译时提示上边的警告了。

    贴下我当时的一个错误或者不合理写法:

    publicclassMyFragment extendsBaseFragment{

        publicMyFragment(Context context) {

            mContext = context;

        }

        publicstaticMyFragment newInstance(Context context) {

            returnnewMyFragment (context);

        }

    }

    为了不让报这个错,还是按照官方建议写一个无参的构造函数,如下:

    publicclassMyFragment extendsBaseFragment{

        publicMyFragment() {

        }

        publicstaticMyFragment newInstance(Context context) {

            mContext = context;

            returnnewMyFragment ();

        }

    }

    其实也可以直接把无参的构造函数去掉,系统会默认创建的。

    报错2:

    ?

    1Avoid non-defaultconstructors in fragments: use a defaultconstructor plus Fragment#setArguments(Bundle) instead [ValidFragment]

    在打包时出现这个问题,在类上加一个注解@SuppressLint(“ValidFragment”)可以达到不报错的目的,但是为避免Fragment中的非默认构造函数,官方还是建议使用默认构造函数加上Fragment#setArguments(Bundle)代替[ValidFragment]。

    所以需要修改为如下的形式:

    publicclassMyFragment extendsBaseFragment{

        publicMyFragment() {

            mContext = getActivity();

        }

        publicstaticMyFragment newInstance(String tag) {

            MyFragment myFragment = newMyFragment();

            Bundle bundle = newBundle();

            bundle.putString("tag",tag);

            myFragment.setArguments(bundle);

            returnmyFragment;

        }

    }

    按照上边的建议来修改Fragment的构造函数和静态工厂方法newInstance()来获取实例就可以避免在正式打包时报上边的两个错误了。

    其实,还有一种方法也能达到不报错的目的,就是直接在 build.gradle 配置文件中的android{ ··· }节点内添加配置禁止在正式打包时检测这个错误就可以了,添加格式如下:

    android {

        ··· ···

        buildTypes {

            release {

                ··· ···

            }

            debug {

                ··· ···

            }

        }

        lintOptions {

            abortOnError false

            checkReleaseBuilds false

        }

    }

    但是个人建议,应该尽量还是按照Google官方的建议解决方案来处理会比较好些。当然也可以视具体情况而定。

    相关文章

      网友评论

          本文标题:Fragment构造函数打包时的踩坑:should provid

          本文链接:https://www.haomeiwen.com/subject/zqkycftx.html