美文网首页Android开发学习android杂记自定义View系列
安卓日记——设计一个通用的BaseActivity

安卓日记——设计一个通用的BaseActivity

作者: 饥渴计科极客杰铿 | 来源:发表于2016-06-11 09:34 被阅读14054次

    如果是只有一个Activity的App就没有必要写BaseActivity,但一旦大于一个我还是建议写一个BaseActivity,准没错。

    每个Activity通常都是绑定视图,绑定控件,监听控件,获取Bundle,跳转Activity还有一些很有些烦人的小功能如:Toast,findViewById,我们都可以封装一层简化他们的使用

    BaseActivity的代码如下:

    public abstract class BaseActivity extends Activity implements View.OnClickListener {
        /** 是否沉浸状态栏 **/
        private boolean isSetStatusBar = true;
        /** 是否允许全屏 **/
        private boolean mAllowFullScreen = true;
        /** 是否禁止旋转屏幕 **/
        private boolean isAllowScreenRoate = false;
        /** 当前Activity渲染的视图View **/
        private View mContextView = null;
        /** 日志输出标志 **/
        protected final String TAG = this.getClass().getSimpleName();
    
        /** View点击 **/
        public abstract void widgetClick(View v);
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.d(TAG, "BaseActivity-->onCreate()");
            Bundle bundle = getIntent().getExtras();
            initParms(bundle);
            View mView = bindView();
            if (null == mView) {
                mContextView = LayoutInflater.from(this)
                        .inflate(bindLayout(), null);
            } else
                mContextView = mView;
            if (mAllowFullScreen) {
                requestWindowFeature(Window.FEATURE_NO_TITLE);
            }
            if (isSetStatusBar) {
                steepStatusBar();
            }
            setContentView(mContextView);
            if (!isAllowScreenRoate) {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
            initView(mContextView);
            setListener();
            doBusiness(this);
        }
    
        /**
         * [沉浸状态栏]
         */
        private void steepStatusBar() {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                // 透明状态栏
                getWindow().addFlags(
                        WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                // 透明导航栏
                getWindow().addFlags(
                        WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
            }
        }
    
        /**
         * [初始化参数]
         *
         * @param parms
         */
        public abstract void initParms(Bundle parms);
    
        /**
         * [绑定视图]
         *
         * @return
         */
        public abstract View bindView();
    
        /**
         * [绑定布局]
         *
         * @return
         */
        public abstract int bindLayout();
    
        /**
         * [初始化控件]
         *
         * @param view
         */
        public abstract void initView(final View view);
    
        /**
         * [绑定控件]
         *
         * @param resId
         *
         * @return
         */
        protected    <T extends View> T $(int resId) {
            return (T) super.findViewById(resId);
        }
    
        /**
         * [设置监听]
         */
        public abstract void setListener();
    
        @Override
        public void onClick(View v) {
            widgetClick(v);
        }
    
        /**
         * [业务操作]
         *
         * @param mContext
         */
        public abstract void doBusiness(Context mContext);
    
    
    
        /**
         * [页面跳转]
         *
         * @param clz
         */
        public void startActivity(Class<?> clz) {
            startActivity(new Intent(BaseActivity.this,clz));
        }
    
        /**
         * [携带数据的页面跳转]
         *
         * @param clz
         * @param bundle
         */
        public void startActivity(Class<?> clz, Bundle bundle) {
            Intent intent = new Intent();
            intent.setClass(this, clz);
            if (bundle != null) {
                intent.putExtras(bundle);
            }
            startActivity(intent);
        }
    
        /**
         * [含有Bundle通过Class打开编辑界面]
         *
         * @param cls
         * @param bundle
         * @param requestCode
         */
        public void startActivityForResult(Class<?> cls, Bundle bundle,
                                           int requestCode) {
            Intent intent = new Intent();
            intent.setClass(this, cls);
            if (bundle != null) {
                intent.putExtras(bundle);
            }
            startActivityForResult(intent, requestCode);
        }
    
        @Override
        protected void onRestart() {
            super.onRestart();
            Log.d(TAG, "onRestart()");
        }
    
        @Override
        protected void onStart() {
            super.onStart();
            Log.d(TAG, "onStart()");
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            Log.d(TAG, "onResume()");
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            Log.d(TAG, "onPause()");
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            Log.d(TAG, "onStop()");
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.d(TAG, "onDestroy()");
        }
    
        /**
         * [简化Toast]
         * @param msg
         */
        protected void showToast(String msg){
            Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();
        }
    
    
        /**
         * [是否允许屏幕旋转]
         *
         * @param isAllowScreenRoate
         */
        public void setScreenRoate(boolean isAllowScreenRoate) {
            this.isAllowScreenRoate = isAllowScreenRoate;
        }
    
    }
        /**
         * [是否允许全屏]
         *
         * @param allowFullScreen
         */
        public void setAllowFullScreen(boolean allowFullScreen) {
            this.mAllowFullScreen = allowFullScreen;
        }
    
        /**
         * [是否设置沉浸状态栏]
         *
         * @param isSetStatusBar
         */
        public void setSteepStatusBar(boolean isSetStatusBar) {
            this.isSetStatusBar = isSetStatusBar;
        }
    
        /**
         * [是否允许屏幕旋转]
         *
         * @param isAllowScreenRoate
         */
        public void setScreenRoate(boolean isAllowScreenRoate) {
            this.isAllowScreenRoate = isAllowScreenRoate;
        }
    
    }[是否设置沉浸状态栏]
         *
         * @param isSetStatusBar
         */
        public void setSteepStatusBar(boolean isSetStatusBar) {
            this.isSetStatusBar = isSetStatusBar;
        }
    
        /**
         * [是否允许屏幕旋转]
         *
         * @param isAllowScreenRoate
         */
        public void setScreenRoate(boolean isAllowScreenRoate) {
            this.isAllowScreenRoate = isAllowScreenRoate;
        }
    
    }
    

    可以看到还是很多重复代码的,所以说搞一个BaseActivity是多么有必要

    继承自BaseActivity的Activity使用如下:

    public class MainActivity extends BaseActivity {
        private Button btn1;
        @Override
        public void widgetClick(View v) {
            switch (v.getId()){
                case R.id.button:
                    //用简化了的toast和startActivity
                    showToast("toast");
                    startActivity(Main2Activity.class);
                    break;
            }
        }
    
        @Override
        public void initParms(Bundle parms) {
            //解析bundle内容或者设置是否旋转,沉浸,全屏
        }
    
        @Override
        public View bindView() {
            return null;
        }
    
        @Override
        public int bindLayout() {
            return R.layout.activity_main;
        }
    
        @Override
        public void initView(View view) {
            btn1=$(R.id.button);
        }
    
        @Override
        public void setListener() {
            btn1.setOnClickListener(this);
        }
    
        @Override
        public void doBusiness(Context mContext) {
    
        }
    
    
    }
    

    其实不仅是Activity要搞一个基类,Fragment也要搞一个基类,这样可以大大减少重复代码,而且管理起来还比较容易,保持了样式的一致,如果想个性化也预留了相应的方法。

    相关文章

      网友评论

      • 8d3430c8cc94:bindView()这个方法有什么实际用处
      • 吧主:这篇文章,我给你在公众号原创发布可以吗?公众号:杨守乐
        吧主: @饥渴计科极客杰铿 是的,这些都写的
        饥渴计科极客杰铿:@吧主 可以留下原文地址和作者名吗
      • 用一辈子等待一个幸福:如果这么用的话,butterknife就毁了。:scream_cat:
      • tonyShit:你这个initParms()这个方法 怎么搞呢?怎么看不懂? 应该是传沉浸 旋转 全屏 的boolean 参数进去吧? 但是.....请解释一下
      • Mountain_Lin:看了标题还挺期待的,进来有落差,感觉基本等于就是没封装。
        07c82148bfa4: @Mountain_Lin 封装得挺全面的 非常通用
      • 寒冬22:$方法简直666666
      • 8d3923642b9d:刚在知乎上看见的分享下BaseFragment:https://www.zhihu.com/question/47045239/answer/105086885
      • fb2a6d4cd6c4:你的号码,是多少呢? @Override
        public void initParms(Bundle parms) {
        //解析bundle内容或者设置是否旋转,沉浸,全屏
        }
        这个怎么设置不是全屏的呢?有项目实现的代码吗?
        00dd53b462be:我也想问这个问题,你弄清楚了么?
      • fendo:赞一个
      • c2b55743ab45:绑定布局和绑定视图 的区别是什么?或者是 绑定视图怎么用? 求解答,谢谢~
        饥渴计科极客杰铿:@leon0411 你可以传一个view,或者你传一个layout的id让系统帮你创建一个view
      • i校长:fragment基类,能否分享下,谢谢
      • 望月成三人:很不错,收藏
      • zytcoder:^_^干货,收藏
      • 苏村的南哥: 谢谢分享。
        饥渴计科极客杰铿:@_ZY_ 所谓抽象方法就是都要实现的方法,我不能确保每次每个抽象方法都有内容,但是在常见的场合几乎都要用的
        _ZY_:@KnightOneAdmin K神,这种方式不怎么好把,继承的类有必须实现抽象方法,代码看起来就不漂亮了,我觉得应该定义接口,base类实现接口方法,要用什么方法自己掉用,我是芒果,好久没看到你了,世界小哈
      • 锄小杨:挺好
      • 最怕认真:其实过于追求通用,反而适得其反了,我一直觉得,很多设计模式,真的没有必要,点击按钮,一行代码一定要分拆成多个文件,接口,事件,调来调去
        最怕认真:@razor1991 那叫死板,什么善小,你写个点击按钮显示图片的例子也写一堆文件?说出来有人信的
        崔兴旺:不以善小而不为,以恶小而为之。这里的善与恶指的就是代码结构的清晰与混乱。
        饥渴计科极客杰铿:@最怕认真 当你做大项目,要分工,要更新迭代的时候你就不会这么想了
      • emdd2016:不错
      • 晓峰残月:很好,很详细
      • Marno:差不多,只是开启Activity的方法,我也会单独抽离成一个类来管理
        等你照顾我:@Marno :yum:有机会想见识见识,基础知识有些薄弱呢,想学习学习。

      本文标题:安卓日记——设计一个通用的BaseActivity

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