Android组件化开发之AndroidX踩坑

前言

由于公司有新项目启动,于是我就自己搭了个项目的基本框架,基于AndroidX的支持库(完全取代v4、v7库)加上组件化等等。今天,就我在过程中遇到的坑,做一个记录。对于Android的组件化开发相信大家都不会陌生了,我们一般都是用的阿里的ARouter框架,来解决我们组件、模块间界面跳转。

基本配置

ARouter配置

当然,我们必须要先引入ARouter依赖。由于是组件化,我们一般把依赖放在一个baselibmodule里面的build.gradle文件里面,便于统一配置和管理。
在这里插入图片描述

  1. 在这个build.gradle文件dependencies 节点下面加入我们需要的ARouter依赖
dependencies {
    //路由
    api 'com.alibaba:arouter-api:1.5.0'
    annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
}
  1. 添加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使用

  1. 初始化
    一般推荐在Application里面就进行初始化,代码
       if (isDebug) {
            ARouter.openLog();  // 打印日志
            ARouter.openDebug();    // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
        }
        ARouter.init(mMyApplication);      // 尽可能早,推荐在Application中初始化
  1. 添加注解
    给每个需要跳转的目标页的开头添加@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. 路由跳转
    可以直接跳转,也可以携带参数跳转。
    (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配置

  1. 引入依赖
    我们这里还是在baselibmodule的build.gradle文件里面添加黄油刀的依赖。我们这里是AndroidX支持库,所以采用10.+版本。
dependencies {
	//注解 黄油刀
    api 'com.jakewharton:butterknife:10.2.1'
    annotationProcessor "com.jakewharton:butterknife-compiler:10.2.1"
}
  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使用

  1. 初始化
    在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();
    }
  }
  1. 在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。

猜你喜欢

转载自blog.csdn.net/u014643369/article/details/108764064