Android组件化开发之AndroidX踩坑
前言
由于公司有新项目启动,于是我就自己搭了个项目的基本框架,基于AndroidX的支持库(完全取代v4、v7库)加上组件化等等。今天,就我在过程中遇到的坑,做一个记录。对于Android的组件化开发相信大家都不会陌生了,我们一般都是用的阿里的ARouter框架,来解决我们组件、模块间界面跳转。
基本配置
ARouter配置
当然,我们必须要先引入ARouter依赖。由于是组件化,我们一般把依赖放在一个baselibmodule里面的build.gradle文件里面,便于统一配置和管理。
- 在这个build.gradle文件dependencies 节点下面加入我们需要的ARouter依赖
dependencies {
//路由
api 'com.alibaba:arouter-api:1.5.0'
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
}
- 添加ARouter路由配置
(1)在项目中的每个module的build.gradle文件下面,添加如下配置,不要忘了app主module里面也要添加。
android {
defaultConfig {
//ARouter路由配置
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
}
注意:即使这个module里面没有需要跳转的业务,但是还是要进行配置,不然就会报找不到module name的错误。我就是遇到了这个问题,以为没有需要跳转的业务的module就不需要配置
(2)然后再在其他module的build.gradle文件下面添加如下配置
dependencies {
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
}
这样,我们的ARouter的配置基本上就完成了,接下来就是实现模块之间的界面跳转了。
ARouter使用
- 初始化
一般推荐在Application里面就进行初始化,代码
if (isDebug) {
ARouter.openLog(); // 打印日志
ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
}
ARouter.init(mMyApplication); // 尽可能早,推荐在Application中初始化
- 添加注解
给每个需要跳转的目标页的开头添加@Route(path=/xxx_module/xxxActivity)注解,代码示例
@Route(path = RouterUrl.COMMON_MAIN)
public class MainActivity extends BaseActivity {
}
public interface RouterUrl{
String COMMON_MAIN = "/common/MainActivity"; //主界面
}
注意:path的路由地址,必须至少两级,不然会报错,而且最后的目标页一定要相对应才能跳转过去。
- 路由跳转
可以直接跳转,也可以携带参数跳转。
(1)直接跳转
ARouter.getInstance().build(RouterUrl.COMMON_MAIN).navigation();
(2)携带参数跳转
ARouter.getInstance().build(RouterUrl.COMMON_MAIN)
.withString("key", "value")
.withInt("key",value)
.navigation();
获取携带参数值的话,和普通的Intent跳转取值一样
String value = getIntent().getExtras().getString("key");
以上,ARouter的配置和用法基本上就结束了,但是我们一般项目中会加入黄油刀(butterknife)注解框架来简化我们findviewbyid的过程,接下来我们继续看butterknife在组件化里面的使用。
Butterknife配置
- 引入依赖
我们这里还是在baselibmodule的build.gradle文件里面添加黄油刀的依赖。我们这里是AndroidX支持库,所以采用10.+版本。
dependencies {
//注解 黄油刀
api 'com.jakewharton:butterknife:10.2.1'
annotationProcessor "com.jakewharton:butterknife-compiler:10.2.1"
}
- 配置依赖
(1)在每一个module的build.gradle文件下面的dependencies节点下,添加如下代码
annotationProcessor "com.jakewharton:butterknife-compiler:10.2.1"
注意:每个module下面必须要添加,不然点击事件是无法使用的,这个坑我踩过。
(2)在每一个module的build.gradle文件下面的最上面添加如下代码
apply plugin: 'com.jakewharton.butterknife'
(3)在rootProject目录下的build.gradle里面添加如下配置
dependencies {
classpath 'com.android.tools.build:gradle:3.6.2'
classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.1'
}
以上,黄油刀的配置基本上完成了,接下来我们看看它的使用。
Butterknife使用
- 初始化
在Activity的onCreate()方法里面绑定,我们这里使用的BaseActivity基类,绑定和解绑都在这里进行。
public abstract class BaseActivity extends AppCompatActivity{
private Unbinder unbinder;
//....
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//.....
unbinder = ButterKnife.bind(this);
//.....
}
@Override
protected void onDestroy() {
//....
unbinder.unbind();
//.....
super.onDestroy();
}
}
- 在Activity中的使用
(1)初始化view
public class SplashActivity extends BaseActivity {
private final String TAG = "SplashActivity";
@BindView(R2.id.btn_skip)
Button mBtnSkip;
//......
}
注意:这里必须是R2.id.xxx,不然会报以下错误。有的时候可能会出现找不到这个id的情况,多rebuild几下就好了。
(2)点击事件
这里的点击事件,和我们不使用组件化的点击事件也略有不同
不使用组件化
@OnClick({R.id.btn_skip})
public void onViewClicked(View view) {
switch (view.getId()){
case R.id.btn_skip:
//.....
break;
}
}
使用组件化
@OnClick({R2.id.btn_skip})
public void onViewClicked(View view) {
int id = view.getId();
if (id == R.id.btn_skip){
ToastUtils.showToast(this, "");
}
}
在使用组件化的时候,我们在@OnClick注解里面必须使用R2去找这个id,然后在方法里面,我们不能使用switch-case语句,只能使用if-else语句,而且if判断里面的只能用R去找这个id。