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

Android 基类封装之Activity【原创】

Android 李, 泰愚 197浏览 0评论

Android开发中,我们往往都需要封装一个基类的Activity,以用于封装一些基本公用的方法,避免代码的重复,提高程序的可读性可维护性等。

从onCreate方法开始,这是Activity生命周期中重要的一步,我们的思路是将一些方法都放在这里执行,然后让子类重写那些在onCreate方法中执行的方法,在重写中做自己的需要的业务逻辑,代码如下:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //在界面未初始化之前调用的初始化窗口
    initWindows();

    if (initArgs(getIntent().getExtras())) {
        //得到Activity界面layout的Id并设置到Activity中
        int layId = getContentLayoutId();
        setContentView(layId);
        initBefore();
        initWidget();
        initData();
    } else {
        finish();
    }

}

代码的流程是先调用initWindows初始化窗口相关的操作,然后调用initArgs方法判断传过来的参数是否正确,如不正确返回false则直接finish。如果正确,那么紧接着走getContentLayoutId方法,拿到返回的布局文件的id,且设置给页面。紧接着调用initBefore,这是在初始化控件和数据前的一些初始化操作,如没有需求,则不重写,空方法体就好。最后便是初始化控件和初始化数据这两个方法,initBefore和initWidget。

其中getContentLayoutId方法是抽象方法,子类必须重写,因为我们需要获得布局Id才可以设置界面布局。其余方法则是空方法,子类根据需要在重写的时候实现具体的业务逻辑。

接下来的两个方法是:

@Override
public boolean onSupportNavigateUp() {
    //当点击界面导航返回时,Finish当前界面
    finish();
    return super.onSupportNavigateUp();
}

@Override
public void onBackPressed() {
    //得到当前Activity下所有的Fragment
    List<android.support.v4.app.Fragment> fragments = getSupportFragmentManager().getFragments();
    //判断是否为空
    if (fragments != null && fragments.size() > 0) {
        for (android.support.v4.app.Fragment fragment : fragments) {
            //判断是否为我们能够处理的Fragment类型
            if (fragment instanceof Fragment) {
                //判断是否拦截了返回按钮
                if (((Fragment) fragment).onBackPressed()) {
                    //如果拦截了返回按钮,直接return
                    return;
                }
            }
        }
    }

    super.onBackPressed();
    finish();
}

onSupportNavigateUp如注释所说,是在点击页面导航按钮时,结束当前界面,当然,如果并没有用到页面导航按钮,也可以不用。其次就是常见的重写onBackPressed,返回键逻辑,先拿到当前Activity下的所有Fragment,如果有的话,则调用Fragment基类中重写的的onBackPressed,看子Fragment是否重写了返回键逻辑,如果有,则直接返回。

下面是完整代码:

public abstract class Activity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //在界面未初始化之前调用的初始化窗口
        initWindows();

        if (initArgs(getIntent().getExtras())) {
            //得到Activity界面layout的Id并设置到Activity中
            int layId = getContentLayoutId();
            setContentView(layId);
            initBefore();
            initWidget();
            initData();
        } else {
            finish();
        }

    }

    /**
     * 初始化控件调用之前
     */
    protected void initBefore() {

    }

    /**
     * 初始化窗口
     */
    protected void initWindows() {

    }

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

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

    /**
     * 初始化控件
     */
    protected void initWidget() {
        ButterKnife.bind(this);
    }

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

    }

    @Override
    public boolean onSupportNavigateUp() {
        //当点击界面导航返回时,Finish当前界面
        finish();
        return super.onSupportNavigateUp();
    }

    @Override
    public void onBackPressed() {
        //得到当前Activity下所有的Fragment
        List<android.support.v4.app.Fragment> fragments = getSupportFragmentManager().getFragments();
        //判断是否为空
        if (fragments != null && fragments.size() > 0) {
            for (android.support.v4.app.Fragment fragment : fragments) {
                //判断是否为我们能够处理的Fragment类型
                if (fragment instanceof Fragment) {
                    //判断是否拦截了返回按钮
                    if (((Fragment) fragment).onBackPressed()) {
                        //如果拦截了返回按钮,直接return
                        return;
                    }
                }
            }
        }

        super.onBackPressed();
        finish();
    }
}

关于Fragment的基类,之后发。

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


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

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