美文网首页Android开发Android技术知识Android开发
我理解的BaseActivityBaseFragment应该这么

我理解的BaseActivityBaseFragment应该这么

作者: 卖臭豆腐的王致和 | 来源:发表于2018-06-20 09:40 被阅读116次
    转载请注明原创出处,谢谢!

    我的BaseActivity是有一个弊端的,因为用了反射的关系,所以在性能上会有一定的影响,但问题不是很大,可以忽略不计,当然,如果你对性能要求特别高,不建议使用。

    为什么要这么写?

    • 不想每次都写setContentView(layoutId)方法,所以就用一个反射的方式,来减少每次写的代码。
    • 养成良好的编码习惯,布局命名规范。
    • 让自己的代码,具有自己的风格。
    • 是不是显得技术会很厉害???哈哈哈

    为什么不像别人一样,把log,toast,intent什么的也写进去?

    • 这些东西应该有专门的Utils去管理,例如xUtils就不错,实在不想写,可以当Ctrl+C/V大神啊,而不是臃肿的放在BaseActivity中。
    • 竟可能的少些一些代码,会让别人看着舒服!

    BaseActivity核心代码

    用了这个BaseActivity,你只要将布局的xml命名为layout_abc,java命名为AbcActivity,它就会自动加载布局,而不需要每次setContentView了。(注意大小写)

    public abstract class BaseActivity extends AppCompatActivity {
        @Override
        //  ***这里要用一个参数的onCreate,两个参数是不会显示页面内容的***这个坑我踩过!记一下。。
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // 尝试调用setContentView(layoutId)方法
            // 尝试根据类名(例如:MainActivity)--->资源文件的名字(activity_main)
            String clazzName = this.getClass().getSimpleName();// MainAcitivity
            if (clazzName.contains("Activity")) {
                String activityName = clazzName.substring(0,
                        clazzName.indexOf("Activity")).toLowerCase(Locale.US);// main
                String resName = "activity_" + activityName;// activity_main
                // 根据resName找到其对应的resId(根据activity_main--->R.layout.activity_main)
                int resId = getResources().getIdentifier(resName, "layout",
                        getPackageName());
                if (resId != 0) {
                    // 确实找到了资源ID(R.layout.activity_main)
                    setContentView(resId);
                }
            }
            initView();
            initListener();
            MyApp.addActivity(this);// 将正在创建的活动添加到活动管理器里
        }
    
        protected abstract void initView();
    
        protected abstract void initListener();
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            MyApp.removeActivity(this);// 将一个要销毁的活动从活动管理器里移除
        }
    }
    

    同样BaseFragment也可以

    public abstract class BaseFragment extends Fragment {
        protected View contentView = null;
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            // SettingFragment;
            String clazzName = getClass().getSimpleName();
            if (clazzName.contains("Fragment")) {
                // "标准"的布局文件命名应该是:fragment_setting
                String layoutName = clazzName.substring(0,
                        clazzName.indexOf("Fragment")).toLowerCase(Locale.US);
                layoutName = "fragment_" + layoutName;
                // R.layout.fragment_setting
                int resId = getResources().getIdentifier(layoutName, "layout",
                        getActivity().getPackageName());
    
                if (resId != 0) {
                    contentView = inflater.inflate(resId, container, false);// 利用反射,加载布局
                }
            }
            return contentView;
        }
        
        @Override
        public void onStart() {
            super.onStart();
            init();
        }
        
        public void init() {// 如果有特殊原因,反射没有成功,你可以在这里,二次加载
            // No-OP 钩子方法
        }
    }
    

    相关文章

      网友评论

      • 78983551cc90:老哥不用As的快捷键创建Activity么
        卖臭豆腐的王致和:@设计师吴彦祖 咱俩说的可能不是一个事。。。
        78983551cc90:@卖臭豆腐的王致和 AndroidStudio创建文件都有快捷键的, 平台差异性可能有所不同, 我就不说了, 会自动创建类和Layout以及在AndroidManifest注册
        卖臭豆腐的王致和:@设计师吴彦祖 ???什么快捷键?

      本文标题:我理解的BaseActivityBaseFragment应该这么

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