# Dcct-Android
**Repository Path**: MakerJoson/Dcct-Android
## Basic Information
- **Project Name**: Dcct-Android
- **Description**: 【Android端药物互作用检测平台】使用了Retrofit+RxJava、Glide、AutoSize、SweetAlert、LoadingDialog、Material、ViewBinding框架。
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2020-04-03
- **Last Updated**: 2021-07-08
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# DCCT
1. 先安排几张APP图:
2. APP Version 1.0.1所实现的功能:
- 登录注册:输入的邮箱格式检测、当第一次登录成功之后,杀死应用再次打开应用,将直接进入主界面;
- 引导页面:只有在安装后第一次打开应用时才会展示;
- 退出登录:在主界面点击左上角的用户名就可以退出登录;
- 广场:向用户推荐药物相管的文章,后台服务器能实时更新推送内容;
- 检测:提供了两种检查类型,当正确输入信息之后,在有返回结果的条件下,页面将跳转至报告页;
- 记录:这里展示个人所有的查询记录(检测种类、名称、时间),点击记录将会跳转至查询结果页面;
3. 本项目我是第一此使用**Retrofit**,之前一直在使用**okhttp**,当然这也是比较好的工具,就我本次项目体验而言,Retrofit提供的注解对我们提升开发效率帮助很大,这个很类似与后台的SpringBoot,比如我们在RequestParam时,我们需要一个一个的构造参数,但是retrofit可以使用**@QueryMap**,如果只是单个参数,可以使用**@Query**。如果时传输路径变量则使用**@Path**,还有**@GET**、**@POST**等注解。
```java
public interface API {
@POST(Constant.LOGIN_API)
Call> submitLoginData(@Body LoginUserEntity loginUserEntity);
@POST(Constant.REGISTER_API)
Call submitRegisterData(@Body RegisterUserEntity registerUserEntity);
@GET(Constant.COVER_API)
Call>> getImageUrl();
@POST(Constant.QUERY_API)
Call>> submitQueryData(@Body PostQueryEntity postQueryEntity);
@GET(Constant.RECORD_API)
Call>> getRecords(@Path("uid") long id);
@POST(Constant.SIGN_OUT)
Call subSignOutId(@Path( "uid" ) long id);
}
```
4. - 本项目是我自己更加熟练的掌握了**View**之间的各种形式的传递数据
- 对**Activity**四种启动模式有比较深入理解
- 如何在**Activity**异常退出,重新进入时还原之前界面数据信息
- 了解了**Serializable**、**Parcelable**,实现对象序列化比较两者的优缺点,在**Intent**在两活动之间传输数据和**SpringBoot** Entity中都使用了对象序列化
- **TabLayout**与**ViewPager**联合使用,**Toolbar**与**TabLayout**联合使用,避免了再单独定义item_top子布局
- **沉浸式界面**运用(启动界面和引导页面),注意修改状态栏字体颜色修改(默认白色)
5. 最令我开心的事情是我完成了**屏幕适配**:
- **[字节跳动的屏幕适配方案](https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA)**
```java
public static float sNoncompatDensity;
public static float sNoncompatScaledDensity;
public static void setCustomDensity(Activity activity, final Application application){
final DisplayMetrics appDisplayMetrics = application.getResources().getDisplayMetrics();
if (sNoncompatDensity == 0){
sNoncompatDensity = appDisplayMetrics.density;
sNoncompatScaledDensity = appDisplayMetrics.scaledDensity;
application.registerComponentCallbacks( new ComponentCallbacks() {
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
if (newConfig.fontScale > 0) {
sNoncompatScaledDensity = application.getResources().getDisplayMetrics().scaledDensity;
}
}
@Override
public void onLowMemory() {
}
} );
}
final float targetDensity = (float) appDisplayMetrics.widthPixels / 360;
System.out.println(appDisplayMetrics.widthPixels);
System.out.println(targetDensity);
final float targetScaledDensity = targetDensity * (sNoncompatScaledDensity / sNoncompatDensity);
final int targetDensityDpi = (int) (160 * targetDensity);
appDisplayMetrics.density = targetDensity;
appDisplayMetrics.densityDpi = targetDensityDpi;
appDisplayMetrics.scaledDensity = targetScaledDensity;
final DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();
activityDisplayMetrics.density = targetDensity;
activityDisplayMetrics.scaledDensity = targetScaledDensity;
activityDisplayMetrics.densityDpi = targetDensityDpi;
}
```
> 在Activity的onCreate方法中调用调用即可
>
> 原文章 **final float targetDensity = (float) appDisplayMetrics.widthPixels / 360**,这里的**appDisplayMetrics.widthPixels**并没有强转为float类型,实际上这里的强转是必须要的。
- **[ AndroidAutoSize](https://github.com/JessYanCoding/AndroidAutoSize)**
> 同样是基于字节跳动的屏幕适配原理,但是作者在此基础上做了很好的优化,而且使用教程也是一看就懂。我的项目做使用了此框架,原始的字节跳动屏幕适配方案我也尝试过,效果上差别是不大的(未牵扯到限定某页面不使用屏幕适配的情况),前者使用需要在每个Activity中进行调用适配方法,没有后者使用方便,而且后者也对Fragment做很很好的处理,并且对老项目也提供的使用方法。
```
implementation 'me.jessyan:autosize:1.2.0'
```