# tab6
**Repository Path**: toocms-android/tab6
## Basic Information
- **Project Name**: tab6
- **Description**: 晟轩科技Android系统开发基础框架
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: http://www.toocms.com/
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2021-08-11
- **Last Updated**: 2024-04-12
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Android
## README
# 集成文档
[](https://jitpack.io/#com.gitee.toocms-android/tab6)  
## 添加Gradle依赖
- 在项目根目录的settings.gradle文件中添加
```
dependencyResolutionManagement {
repositories {
maven { url "https://jitpack.io" }
maven { url 'https://developer.huawei.com/repo/' }
maven { url 'https://repo1.maven.org/maven2/' }
maven { url "https://dl.bintray.com/thelasterstar/maven/" } // 目前只有新浪微博分享用到,不需要可删除
}
}
```
- 在模块目录下的build.gradle文件的dependencies添加
```
android {
defaultConfig {
multiDexEnabled true
dataBinding { enabled = true } // 启动DataBinding
}
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8 // Java1.8
sourceCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
def tab6_version = "6.1.18.6"
implementation "com.gitee.toocms-android.tab6:tab:${tab6_version}" // 核心必须依赖
implementation "com.gitee.toocms-android.tab6:tab-expand:${tab6_version}" // 扩展包
implementation "com.gitee.toocms-android.tab6:tab-pay:${tab6_version}" // 支付包
implementation "com.gitee.toocms-android.tab6:tab-share:${tab6_version}" // 分享包
implementation "com.gitee.toocms-android.tab6:tab-map:${tab6_version}" // 地图包
implementation "com.gitee.toocms-android.tab6:tab-push:${tab6_version}" // 推送包
}
```
- 在根目录的gradle.properties文件中增加两行代码
```properties
# 使用Android X
android.useAndroidX=true
# 自动转换为第三方库使用Android X
android.enableJetifier=true
```
## 集成方法
该框架主张用Fragment代替Activity以免去Manifest中注册的麻烦
1. 包名下创建BaseFgt抽象类,继承BaseFragment类,该类中可实现一些针对项目通用的方法,其他Fragment类继承BaseFgt类
2. 包名下创建config包,在config包下新建AppConfig类,实现IAppConfig接口,并按项目需求实现其方法即可
3. 在values文件夹中创建theme.xml文件,自定义主题继承TooCMS.Compat主题
```xml
```
4. 在Manifest文件中指定该自定义主题
```xml
```
## 思想概述
该版本秉承MVVM开发模式,代表类:[BaseModel](https://github.com/toocms-library/tab6/blob/master/tab/src/main/java/com/toocms/tab/base/BaseModel.java)(Model基类)、[BaseFragment](https://github.com/toocms-library/tab6/blob/master/tab/src/main/java/com/toocms/tab/base/BaseFragment.java)(View基类)、[BaseViewModel](https://github.com/toocms-library/tab6/blob/master/tab/src/main/java/com/toocms/tab/base/BaseViewModel.java)(ViewModel基类)
### 各类作用域:
- BaseModel:主要负责本地数据的存储,基本很少用到
- BaseFragment:主要负责对View的初始化以及刷新操作
- BaseViewModel:主要负责网络数据请求、收发事件、逻辑处理等操作,并且该类已绑定BaseFragment的生命周期以及动作,例如:onResume、startFragment等
## 使用方法
### BaseActivity使用方法
创建Activity类继承BaseActivity类,添加注解@DefaultFirstFragment,参数为项目首页的Fragment类
```java
@DefaultFirstFragment(MainFgt.class)
public class MainActivity extends BaseActivity {
}
```
### BaseModel使用方法
1. 创建类继承BaseModel,如需在页面退出时清除数据可重写onCleared回调方法
2. 在该类中可借助SPUtils或数据库框架进行本地数据的存储
3. 如若依赖了tab-expand可继承LoginStatusRepository类,该类实现了记录用户登录状态的逻辑
4.
存储用户信息的Model可参考[UserRepository](https://github.com/toocms-library/tab6/blob/master/app/src/main/java/com/toocms/sample/data/UserRepository.java)类
### BaseFragment使用方法
1. 创建Fragment类继承BaseFragment类,并实现其抽象方法
```java
public class HttpFgt extends BaseFgt {
@Override
protected void onFragmentCreated() { // Fragment创建完毕回调
topBar.setTitle("网络请求"); // topBar为标题栏View
}
@Override
protected int getLayoutResId() { // 指定布局文件
return R.layout.fgt_tool_http;
}
@Override
public int getVariableId() { // 指定ViewModel的变量ID
return BR.httpViewModel;
}
@Override
protected void viewObserver() { // 观察者更新UI,通过观察ViewModel中定义的SingleLiveEvent变量的数据改变更新UI
viewModel.getUc().setText.observe(this, s -> binding.httpTextview.setText(s));
}
}
```
2. ViewModel的ID创建
```xml
```
3. BaseFragment类必须传入两个泛型参数,ViewDataBinding和BaseViewModel
4.
ViewDataBinding为布局文件自动生成的数据绑定类,[查看具体使用方法](https://www.jianshu.com/p/bd9016418af2),传入后即可使用binding变量
5. BaseViewModel可直接传入该类(简单页面,避免再创建一个空类)或其子类即可,传入后即可使用viewModel变量
6.
getViewModel回调,该方法是为Fragment指定ViewModel(当不重写该回调时,只能自动处理ViewModel构造函数只有一个Application的情况),一般用于在ViewModel的构造函数不仅仅只有Application时使用,工厂类参考[AppViewModelFactory](https://github.com/toocms-library/tab6/blob/master/app/src/main/java/com/toocms/sample/data/AppViewModelFactory.java)
```java
@Override
protected UserViewModel getViewModel(){
AppViewModelFactory factory=AppViewModelFactory.getInstance(TooCMSApplication.getInstance());
return new ViewModelProvider(this,factory).get(UserViewModel.class);
}
```
### BaseViewModel使用方法
-
创建类继承[BaseViewModel](https://github.com/toocms-library/tab6/blob/master/tab/src/main/java/com/toocms/tab/base/BaseViewModel.java)并注入Model类,如不需要Model类可注入BaseModel类或不注入即可
```java
public class UserViewModel extends BaseViewModel {
// 注入UserRepository类需用到带Model的构造函数
public UserViewModel(@NonNull Application application, UserRepository model) {
super(application, model);
}
}
```
```java
public class MD5ViewModel extends BaseViewModel { // 注入BaseModel类
// 注入BaseModel类则可用不带Model的构造函数
public MD5ViewModel(@NonNull Application application) {
super(application);
}
}
```
```java
public class MD5ViewModel extends BaseViewModel { // 不注入
// 不注入和注入BaseModel用的构造函数一样
public MD5ViewModel(@NonNull Application application) {
super(application);
}
}
```
- 已注入BaseFragment的生命周期,所以可重写onResume、onDestroy等回调方法(由于是Fragment的生命周期所以onCreate方法不太好用,尽量避免用该方法)
-
可调用[IBaseAction](https://github.com/toocms-library/tab6/blob/master/tab/src/main/java/com/toocms/tab/base/IBaseAction.java)中的所有方法,如showToast、startFragment等方法,会触发BaseFragment中的方法
- View事件要用到BindingCommand类,如点击、长按等,在ViewModel中定义该类对象(可多个),然后在布局文件中需要注册点击事件的View中指定该对象即可
```java
public BindingCommand copy=new BindingCommand(()->{
ClipboardUtils.copyText(uc.setText.getValue());
showToast("已复制");
});
```
- Event发送要用到SingleLiveEvent类,可定义成public类型供Fragment类直接调用
```java
public SingleLiveEvent setText=new SingleLiveEvent<>();
public BindingCommand md5=new BindingCommand(()->
// 点击事件触发后调用setText.setValue来给事件设置新的数据
setText.setValue(EncryptUtils.encryptMD5ToString("com.toocms."+pack.get())));
```
```java
@Override
protected void viewObserver(){
// Fragment类中调用setText.observe来观察数据的改变,当数据改变时更新UI
viewModel.setText.observe(this,s->binding.tvMd5.setText(s));
}
```
### DataBinding使用方法
-
首先绑定ViewModel,然后通过ViewModel获取其变量/方法,[更多绑定方法](https://github.com/toocms-library/tab6/tree/master/tab/src/main/java/com/toocms/tab/binding/viewadapter)
```xml
```
```xml
```
## ApiTool网络请求
- 常用的写法
```java
ApiTool.get("Index/index") // url可与AppConfig类中的BaseUrl拼接使用,也可以指定完整的url
.add("m_id",7)
.asTooCMSResponse(Index.class)
.withViewModel(this)
.request(index->{
});
```
- get方式请求
```java
ApiTool.get("Index/index") // get方式请求
.add("m_id",7) // 添加参数
.asTooCMSResponse(Index.class) // 指定要返回的响应对象的类型(二选一,根据接口的返回数据决定)
.asTooCMSResponseList(User.class) // 指定要返回的响应列表的对象类型(二选一,根据接口的返回数据决定)
.observeOn(AndroidSchedulers.mainThread()) // 切换到主线程,如onStart和onFinally中代码不需要在主线程回调时可以不调用
.onStart(disposable->{
// 当请求开始之前的回调,不需要可以不调用该方法
})
.onFinally(()->{
// 当请求结束时的回调,不需要可以不调用该方法
})
.withViewModel(this) // 绑定ViewModel,绑定后将自动绑定生命周期,Fragment销毁后请求自动取消
.showLoading(false) // 是否显示加载条,绑定了ViewModel后默认显示,可通过该项设置为不显示
.request(index->{
// 调用请求方法,获取响应结果
},(OnError)errorInfo->{
if(errorInfo.isLogicException()){
// 逻辑异常,即为flag为error的情况会回调该方法
}
});
```
- post方式请求,将get换成post即可
```java
ApiTool.post("Index/index") // post方式请求
.add("m_id",7) // 添加参数
.asTooCMSResponse(Index.class) // 指定要返回的响应对象的类型(二选一,根据接口的返回数据决定)
.asTooCMSResponseList(User.class) // 指定要返回的响应列表的对象类型(二选一,根据接口的返回数据决定)
.observeOn(AndroidSchedulers.mainThread()) // 切换到主线程,如onStart和onFinally中代码不需要在主线程回调时可以不调用
.onStart(disposable->{
// 当请求开始之前的回调,不需要可以不调用该方法
})
.onFinally(()->{
// 当请求结束时的回调,不需要可以不调用该方法
})
.withViewModel(this) // 绑定ViewModel,绑定后将自动绑定生命周期,Fragment销毁后请求自动取消
.showLoading(false) // 是否显示加载条,绑定了ViewModel后默认显示,可通过该项设置为不显示
.request(index->{
// 调用请求方法,获取响应结果
},(OnError)errorInfo->{
if(errorInfo.isLogicException()){
// 逻辑异常,即为flag为error的情况会回调该方法
}
});
```
- 上传,写法与post请求无异只是多了一个addFile和asUpload方法
```java
ApiTool.post("http://xlg-api.uuudoo.com/System/upload")
.add("folder","1")
.addFile("head",result.get(0).getCutPath())
.asUpload(progress->{ // 上传进度
progress.getProgress(); // 进度值0-100
})
.asTooCMSResponse(ImageUrl.class)
.request(imageUrl->{
});
```
- 下载
```java
ApiTool.get("http://update.9158.com/miaolive/Miaolive.apk")
.asDownload(FileManager.getDownloadPath()+File.separator+System.currentTimeMillis()+".apk", // 指定下载路径
progress->{ // 下载进度回调
progress.getProgress(); // 进度值0-100
})
.request(fileName->{
// 返回下载的文件的绝对路径
})
```
- 传参的另一种方式
```java
HttpParams params=new HttpParams();
params.put("m_id",7);
params.put("adr_id",5);
ApiTool.post("http://hotpotshop-api.uuudoo.com/Center/setDefault")
.params(params)
.asTooCMSResponse(String.class)
.request(s->ToastUtils.showShort(s));
```
- [更多用法](https://github.com/toocms-library/tab6/blob/master/app/src/main/java/com/toocms/sample/ui/tool/http/HttpViewModel.java)
## ImageLoader图片加载
- DataBinding方式(推荐)
```xml
```
-
代码方式,[更多加载方式](https://github.com/toocms-library/tab6/blob/master/tab/src/main/java/com/toocms/tab/imageload/ImageLoader.java)
```java
ImageLoader.loadUrl2Image("url",imageview,R.drawable.ic_crash_image);
```
## [更多用法](https://github.com/toocms-library/tab6/wiki)