最新消息:文章中包含代码时,请遵守代码高亮规范!

Android 基类封装之Fragment【原创】

Android 李, 泰愚 188浏览 0评论

现在的Android开发中,Activity和Fragment都是必不可少的,正如上篇博客所写,我们都会封装一个基类的Activity来做一些公共基础的操作。对于Fragment应用的越发广泛,在实际开发中,我们也应当封装一个基础的Fragment,让逻辑代码更加清晰,也利于后期的维护和可读性。

直接上代码,首先是几个变量:

protected View mRoot;
 protected Unbinder mRootUnBinder;
 protected boolean mIsFirstInitData = true;

其中,mRoot是Fragment的布局,mRootUnbinder看他的类型就知道,是因为引入了ButterKnife,所以定义这个Unbinder变量,用于后面的控件绑定。而boolean型变量mIsFirstInitData,顾名思义,用于判断是否是第一次初始化数据,用于避免每次加载时都刷新数据,详细看后面的代码。

接下来是onAttach方法:

@Override
public void onAttach(Context context) {
    super.onAttach(context);

    //初始化参数
    initArgs(getArguments());

}

这里只有一个initArgs方法,用于初始化参数,具体实现由子类复写,做具体的业务逻辑。

然后是onCreateView方法:

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    if (mRoot == null) {
        int layId = getContentLayoutId();
        //初始化当前的根布局,但是不在创建时就添加到container里面
        View root = inflater.inflate(layId, container, false);
        initWidget(root);
        mRoot = root;
    } else {
        if (mRoot.getParent() != null) {
            //把当前Root从其父控件中移出
            ((ViewGroup) mRoot.getParent()).removeView(mRoot);
        }
    }

    return mRoot;
}

在这里面先做判断,当前mRoot如果为null,则通过getContentLayoutId方法拿到布局文件的Id,然后通过inflater拿到view,再调用initWidget方法初始化控件,在initWidget方法中调用ButterKnife框架,详细代码后面贴。且将拿到的root赋值给mRoot。若mRoot不为null,则尝试将mRoot从其父控件移出,最后将mRoot返回。

接下来是onViewCreated方法:

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    if(mIsFirstInitData) {
        mIsFirstInitData = false;
        onFirstInit();
    }

    //当View创建完成后初始化数据
    initData();
}

这里首先就用到了mIsFirstInitData这个变了,如果是第一次加载,则调用onFirstInit这个方法,进行第一次的一些必要的初始化操作,然后调用initData方法进行初始化数据。当然,这两个初始化的方法也都是交由子类复写,做具体需要的业务逻辑。

最后在定义一个返回值是boolean类型的onBackPressed方法:

public boolean onBackPressed() {
    return false;
}

如果有子类重写了onBackPressed这个方法,对返回键做了具体的自己的处理,那么就返回true,这个用于Activity中返回键处理时判断子Fragment有没有已经多返回键做了具体处理,具体方法上篇Activity中有写。

最后贴上完整代码:

public abstract class Fragment extends android.support.v4.app.Fragment {

    protected View mRoot;
    protected Unbinder mRootUnBinder;
    protected boolean mIsFirstInitData = true;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        //初始化参数
        initArgs(getArguments());

    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        if (mRoot == null) {
            int layId = getContentLayoutId();
            //初始化当前的根布局,但是不在创建时就添加到container里面
            View root = inflater.inflate(layId, container, false);
            initWidget(root);
            mRoot = root;
        } else {
            if (mRoot.getParent() != null) {
                //把当前Root从其父控件中移出
                ((ViewGroup) mRoot.getParent()).removeView(mRoot);
            }
        }

        return mRoot;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        if(mIsFirstInitData) {
            mIsFirstInitData = false;
            onFirstInit();
        }

        //当View创建完成后初始化数据
        initData();
    }

    /**
     * 初始化相关参数
     *
     * @param bundle 参数Bundle
     * @return 如果参数初始化正确返回true,错误返回false
     */
    protected void initArgs(Bundle bundle) {

    }

    /**
     * 得到当前界面的资源文件Id
     *
     * @return 资源文件Id
     */
    protected abstract int getContentLayoutId();

    /**
     * 初始化控件
     */
    protected void initWidget(View root) {
        mRootUnBinder = ButterKnife.bind(this, root);
    }

    /**
     * 初始化首次数据
     */
    protected void onFirstInit() {

    }

    /**
     * 初始化数据
     */
    protected void initData() {

    }

    /**
     * 返回按键触发时调用
     *
     * @return 返回true代表我已处理返回逻辑,Activity不用自己Finish
     * 返回false代表我没有处理逻辑, Activity自己走自己的逻辑
     */
    public boolean onBackPressed() {
        return false;
    }
}

转载时请注明出处及相应链接,本文永久地址:http://blog.it985.com/22303.html


pay_weixin
pay_weixin
微信打赏
pay_weixin
支付宝打赏
感谢您对作者rick的打赏,我们会更加努力!    如果您想成为作者,请点我

您必须 登录 才能发表评论!