# cmcc-app **Repository Path**: limaokl/cmcc-app ## Basic Information - **Project Name**: cmcc-app - **Description**: cmcc-app cmcc-app - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-12-05 - **Last Updated**: 2024-11-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # BaseFramework(AndroidX) ## BaseFramework 是什么? BaseFramework框架包含沉浸式适配、对 Activity、Fragment 以及 Adapter 的封装,并提供了一些诸如权限申请、跳转、延时操作、提示、日志输出等小工具,以方便快速构建 Android App; Kongzue BaseFramework Jitpack.io License Homepage Demo预览图如下: ![BaseFramework](https://github.com/kongzue/Res/raw/master/app/src/main/res/mipmap-xxxhdpi/img_baseframework_671.jpg) 试用版和使用方法 Demo 可以前往 下载
Kongzue's BaseFramework
## 使用前的约定与须知 - 更轻松!在 BaseActivity 中,约定关键词**me**代替**Activity.this**,因此您在编写代码时,在异步线程中可以轻松使用me关键字直接引用当前的父Activity。 - 请忘掉重写你的 onCreate 吧!在新版本的 BaseFramework 中,请在您的 Activity 的 class 上使用注解 @Layout(R.layout.xxx) ,剩下的事情我们会自动帮您完成! - 规范化!无论是在 BaseActivity 还是 BaseFragment ,默认都有 initViews()、initDatas()、setEvents() 三个方法,他们分别代表加载组件、初始化数据、组件绑定事件三个步骤,因其执行顺序是固定的,且为了代码规范化,这三个方法必须重写,也建议将相关业务逻辑写在对应方法中,以方便维护和管理。 - 骚操作!提供大量更为好用和快捷的常用方法工具,大幅度减少因参数、引用造成的额外代码量,更好用的日志输出方便甩锅,不死的小强更能保证你的 App 不再因为异常而闪退。 ## Maven仓库或Gradle的引用方式 ### 引入方式 1) 前往 build.gradle(project) 添加 jitpack 仓库: ``` allprojects { repositories { ... maven { url 'https://jitpack.io' } } } ``` 2) 引入 BaseFramework: 最新版本: Jitpack.io ``` dependencies { implementation 'com.github.kongzue:BaseFramework:latest.release' } ``` #### Support版本 由于 Google Android Support 的支持原因,Support 版本将不再更新,要使用最后的 Support 支持版本,请前往: [Kongzue BaseFramework(Support)](https://github.com/kongzue/BaseFramework-Support) ## 使用提示 以下文档为各功能模块的介绍,额外的,强烈建议阅读 [DemoActivity.java](https://github.com/kongzue/BaseFramework/blob/master/app/src/main/java/com/kongzue/baseframeworkdemo/activity/DemoActivity.java) 和 [FunctionFragment.java](https://github.com/kongzue/BaseFramework/blob/master/app/src/main/java/com/kongzue/baseframeworkdemo/fragment/FunctionFragment.java) 两个范例代码内容以了解更详细的开发流程和功能说明。 # 目录 · **BaseActivity功能** ···· 沉浸式 ···· 绑定 Layout 布局 ···· 跳转、Activity间通讯 ···· 更简单的跳转后返回数据 ···· 权限申请 ···· BaseActivity提供的小工具 ···· BaseActivity的生命周期 ···· 侧滑返回 ···· 布局绑定和事件绑定 · **BaseFragment功能** ···· BaseFragment 是什么 ···· 绑定 Layout 布局 ···· FragmentChangeUtil ···· BaseFragment 最佳实践 ···· BaseFragment 间的数据传递和回调 · **设置、属性值的存储读取工具 Settings** · **AppManager** · **异步或同步(演示操作)** · **BaseAdapter** ···· JavaBean 适配方式 ···· Map 适配方式 ···· 多种布局的绑定方式 ···· 数据刷新方法 · **增强型日志** · **行为与日志监听 + 不死的小强** · **语言变更工具** · **BaseApp功能** ···· BaseApp提供的小工具 ## BaseActivity功能 ### 沉浸式 在 BaseActivity 中,您还可以使用以下注解对沉浸式进行控制: ``` @DarkStatusBarTheme(true) //开启顶部状态栏图标、文字暗色模式 @DarkNavigationBarTheme(true) //开启底部导航栏按钮暗色模式 @NavigationBarBackgroundColor(a = 255,r = 255,g = 255,b = 255) //设置底部导航栏背景颜色(a = 0,r = 0,g = 0,b = 0可透明) @NavigationBarBackgroundColorInt(-16777216) //设置底部导航栏背景颜色(颜色色值) @NavigationBarBackgroundColorRes(R.color.black) //设置底部导航栏背景颜色(color资源Id) @NavigationBarBackgroundColorHex("#FFFFFF") //设置底部导航栏背景颜色(颜色代码) //也可从代码中进行控制: setDarkStatusBarTheme(true); //开启顶部状态栏图标、文字暗色模式 setDarkNavigationBarTheme(true); //开启底部导航栏按钮暗色模式 setNavigationBarBackgroundColor(Color.argb(255,255,255,255)); //设置底部导航栏背景颜色(a = 0,r = 0,g = 0,b = 0可透明) ``` 建议直接使用无 ActionBar 的 Activity 样式: ``` ``` ### 绑定 Layout 布局 BaseActivity 默认使用注解来绑定布局: ``` @Layout(R.layout.activity_demo) public class DemoActivity extends BaseActivity { ... ``` 不建议重写 onCreate 方法,根据约定,请无需关心绑定布局的过程,你只需要在 initView() 方法中绑定、加载 View 组件,initData() 方法中加载数据,在 setEvents() 方法中绑定事件即可。 除了注解绑定外,你也可以使用 resetLayoutResId() 方法重载布局资源,例如实现自定义主题: ``` @Override protected int resetLayoutResId() { if (darkMode){ return R.layout.activity_demo_dark; }else{ return super.resetLayoutResId(); } } ``` 额外的,你还可以拦截绑定过程,暂时不绑定布局(可能会出现错误,仅用于特殊情况): ``` @Override public boolean interceptSetContentView() { return true; //拦截绑定布局的过程 } ``` 绑定 View 组件请参考 布局绑定和事件绑定 章节 ### 跳转、Activity间通讯(带自定义参数的跳转) Android 默认的 Intent无法支持自定义类型参数的跳转,BaseActivity 通过自有的数据通道允许传输自定义类型的数据给要跳转到的另一个 BaseActivity: 跳转代码范例: ``` Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.mipmap.img_bkg); jump(JumpActivity.class, new JumpParameter() .put("参数1", "这是一段文字参数") .put("参数2", bmp) ); ``` 接收数据代码范例: ``` String parameter1 = (String) getParameter().get("参数1"); if (!isNull(parameter1)) txtP1.setText("第一个参数读取到的值为:" + parameter1); Bitmap parameter2 = (Bitmap) getParameter().get("参数2"); if (parameter2 != null) imgP2.setImageBitmap(parameter2); ``` ### 更简单的跳转后返回数据 以往我们需要通过重写实现 onActivityResult 来实现回传数据,但在 BaseActivity 中,你只需要一个监听器: 跳转代码范例: ``` jump(ResponseActivity.class, new OnJumpResponseListener() { @Override public void OnResponse(JumpParameter parameter) { if (parameter == null) { toast("未返回任何数据"); } else { toast("收到返回数据,参数“返回数据1”中的值为:" + parameter.get("返回数据1")); } } }); ``` 亦可选用同时带参数+返回值的跳转: ``` jump(ResponseActivity.class,new JumpParameter() .put("参数1", "这是一段文字参数") .put("参数2", "这是一段文字参数") , new OnJumpResponseListener() { @Override public void OnResponse(JumpParameter parameter) { if (parameter==null){ toast("未返回任何数据"); }else{ toast("收到返回数据,参数“返回数据1”中的值为:" + parameter.get("返回数据1")); } } }); ``` 返回数据范例: ``` if ((boolean) getParameter().get("needResponse") == true) { setResponse(new Parameter().put("返回数据1", "测试成功")); } //或也可以使用: if ((boolean) getParameter().get("needResponse") == true) { returnParameter(new Parameter().put("返回数据1", "测试成功")); } ``` ### 权限申请 请注意,申请权限依然需要先在你的 app 的 AndroidManifest.xml 中声明权限,然后使用以下代码可以快捷申请: 要申请权限,可使用以下代码进行: ```java Permission.build().LOCATION().get(new OnActivityPermissionCallBack() { @Override public void onSuccess(DemoActivity activity, String[] permissions) { toast("申请权限成功"); } @Override public void onFail(DemoActivity activity) { toast("申请权限失败"); } }); ``` Permission 类提供了一些常用的需要申请的权限类型,可连续使用叠加需要的权限,例如: ```java Permission.build() .PHONE_STATE() .LOCATION() .EXTERNAL_STORAGE() .get(new OnActivityPermissionCallBack() { @Override public void onSuccess(DemoActivity activity, String[] permissions) { } }); ``` 回调方法可选用 OnPermissionResponseListener 或者其新的实现 OnActivityPermissionCallBack,新的实现会返回申请权限时处于活跃状态的 BaseActivity,你也可以指定泛型,若指定了泛型,会在当前存在的对应类型的 BaseActivity 实例上申请权限。 #### 过时的老方法: 要进行权限申请也变得更加简单,只需要实现相应的回调 OnPermissionResponseListener 即可: ``` requestPermission(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, new OnPermissionResponseListener() { @Override public void onSuccess(String[] permissions) { toast("申请权限成功"); } @Override public void onFail() { toast("申请权限失败"); } }); ``` ### BaseActivity提供的小工具 ``` //快速调用 Toast: toast(Obj); //简易Log打印日志(BaseFrameworkSettings.DEBUGMODE = false关闭,注意此开关是同时影响 BaseActivity 和 BaseFragment的): log(Obj); //软键盘开关: setIMMStatus(boolean show, EditText editText); //dip与像素px转换: dip2px(float dpValue); //像素px与dip转换: dip2px(float dpValue); //属性动画: moveAnimation(Object obj, String perference, float aimValue, long time, long delay); //数据判空(适合网络返回值判断处理,即便为字符串“null”也为空): isNull(String); //跳转动画(参数为您的动画资源id): jumpAnim(int enterAnim, int exitAnim) //使用默认浏览器打开链接 openUrl(String url) //打开指定App openApp(String packageName) //检测App是否已安装 isInstallApp(String packageName) //获取IMEI //请预先在 AndroidManifest.xml 中声明: getIMEI() //获取AndroidID getAndroidId() //获取Mac地址 //请预先在 AndroidManifest.xml 中声明: getMacAddress() //获取根布局 getRootView() //获取状态栏的高度 getStatusBarHeight() //获取屏幕宽度 getDisplayWidth() //获取屏幕可用部分高度(屏幕高度-状态栏高度-屏幕底栏高度) getDisplayHeight() //获取底栏高度 getNavbarHeight() //获取真实的屏幕高度,注意判断非0 getRootHeight() //返回按键事件拦截(重写此方法,return true为拦截返回按键事件) onBack() ``` 另外,为方便开发,从 6.7.2 版本起,会自动对布局中使用“back”作为 id 的 View 会自动绑定返回事件(可重写) ### BaseActivity的生命周期 通常的,您可以通过重写 onCreate()、 onResume()、 onPause()、 onDestroy() 四个方法来监控 Activity 的生命周期,但因为每个方法为独立的方法函数,可能在较多代码时不容易寻找他们的存在。 在 BaseActivity 中,您可以通过 setLifeCircleListener(LifeCircleListener LifeCircleListener) 来直接添加一个生命周期监听器,其中就包含了上述的四个方法,进行统一管理: ``` setLifeCircleListener(new LifeCircleListener() { @Override public void onCreate() { } @Override public void onResume() { } @Override public void onPause() { } @Override public void onDestroy() { } }); ``` 如果你要监控所有 BaseActivity 的生命周期,在 6.5.6 版本起新增了 setGlobalLifeCircleListener(GlobalLifeCircleListener globalLifeCircleListener) 用于对所有 BaseActivity 进行统一管理: ``` BaseActivity.setGlobalLifeCircleListener(new GlobalLifeCircleListener() { @Override public void onCreate(BaseActivity me, String className) { } @Override public void onResume(BaseActivity me, String className) { } @Override public void onPause(BaseActivity me, String className) { } @Override public void onDestroy(BaseActivity me, String className) { } }); ``` 注意此方法为静态的,要使用它建议在 Application 中对它进行管理。 从 6.6.9 版本起新增了 setOnActivityStatusChangeListener(...) 用于监听 Activity 的创建、关闭以及全部 Activity 退出的状态: ``` AppManager.setOnActivityStatusChangeListener(new AppManager.OnActivityStatusChangeListener() { @Override public void onActivityCreate(BaseActivity activity) { } @Override public void onActivityDestroy(BaseActivity activity) { } @Override public void onAllActivityClose() { Log.e(">>>", "所有Activity已经关闭"); } }); ``` ### 侧滑返回 从 6.5.8 版本起,您可以对 BaseActivity 进行注解,来实现侧滑返回: ``` @SwipeBack(true) //开启侧滑返回 public class YourActivity extends BaseActivity { //... ``` 效果如下: ![SwipeBack](https://github.com/kongzue/Res/raw/master/app/src/main/res/mipmap-xxxhdpi/baseframework_swipeback.png) 此效果使用到的框架来源于开源的 @ikew0ng 的 SwipeBackLayout() 开源协议为 Apache License2.0 ### 布局绑定和事件绑定 在 BaseActivity 和 BaseFragment 中均可使用事件绑定 使用注解 @BindView(int id) 以替代 findViewById(int id) 方法: ``` @BindView(R.id.btn_ok) private Button okButton; ``` 使用注解 @BindViews(int id) 以替代 findViewById(int id) 方法: ``` @BindViews({R.id.key1, R.id.key2, R.id.key3}) private List