一:ButterKnife
在你的 app 模块的 build.gradle 文件中,添加以下依赖:
implementation 'com.jakewharton:butterknife:10.2.3'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'
在Activity中
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
public class MainActivity extends AppCompatActivity {
@BindView(R.id.textView)
TextView textView;
@BindString(R.string.login_error) String loginErrorMessage;
private Unbinder unbinder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 进行视图绑定
unbinder = ButterKnife.bind(this);
textView.setText("Hello, ButterKnife!");
}
@OnClick(R.id.button)
void onButtonClick() { // 处理按钮点击事件 }
@Override
protected void onDestroy() {
super.onDestroy();
// 解除视图绑定
unbinder.unbind();
}
}
其他Fragment相关注解使用,参考文章: segmentfault.com/a/119000001…
二:ARouter
在你的 app 模块的 build.gradle 文件中,添加以下依赖:
implementation 'com.alibaba:arouter-api:x.x.x' // 替换为最新版本号
annotationProcessor 'com.alibaba:arouter-compiler:x.x.x' // 替换为最新版本号
在你的 Application 类中进行 ARouter 的初始化配置。在 onCreate 方法中,使用 ARouter.init() 进行初始化:
import android.app.Application;
import com.alibaba.android.arouter.launcher.ARouter;
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 初始化 ARouter
if (BuildConfig.DEBUG) {
ARouter.openLog();
ARouter.openDebug();
}
ARouter.init(this);
}
}
在需要跳转的页面中,使用 @Route 注解定义路由路径。例如:
import com.alibaba.android.arouter.facade.annotation.Route;
import androidx.appcompat.app.AppCompatActivity;
@Route(path = "/app/second")
public class SecondActivity extends AppCompatActivity {
// ...
}
跳转:
import com.alibaba.android.arouter.launcher.ARouter;
// ...
ARouter.getInstance().build("/app/second").navigation();
传递参数:
MyObject myObject = new MyObject("example", 10);
Bundle bundle = new Bundle();
bundle.putString("key", "value");
bundle.putInt("count", 5);
ARouter.getInstance()
.build("/app/second")
.withString("key", "value")
.withInt("count", 5)
.withBoolean("isSpecial", true)
.withBundle("bundle", bundle)
.withSerializable("myObject", myObject)
.navigation();
目标页面:
String value = getIntent().getStringExtra("key");
int count = getIntent().getIntExtra("count", 0);
boolean isSpecial = getIntent().getBooleanExtra("isSpecial", false);
Bundle bundle = getIntent().getBundleExtra("bundle");
if (bundle != null) {
String value = bundle.getString("key");
int count = bundle.getInt("count", 0);
MyObject myObject = (MyObject) getIntent().getSerializableExtra("myObject");
}
ARouter 的反向传值:
1、创建拦截器:
import android.content.Context;
import com.alibaba.android.arouter.facade.Postcard;
import com.alibaba.android.arouter.facade.callback.InterceptorCallback;
import com.alibaba.android.arouter.facade.template.IInterceptor;
public class MyInterceptor implements IInterceptor {
@Override
public void process(Postcard postcard, InterceptorCallback callback) {
// 拦截目标页面返回操作
if (postcard.getDestination().getPath().equals("/app/second")) {
// 在这里处理传递的数据
// ...
// 继续执行路由跳转
callback.onContinue(postcard);
} else {
// 不拦截其他页面
callback.onContinue(postcard);
}
}
@Override
public void init(Context context) {
// 初始化操作
}
}
2、在Application里面注册拦截器
ARouter.getInstance().addInterceptor(new MyInterceptor());
3、在目标页面返回数据
@Route(path = "/app/second")
public class SecondActivity extends AppCompatActivity {
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("resultData", "Data from SecondActivity");
setResult(RESULT_OK, intent);
super.onBackPressed();
}
}
4、在源页面中,可以在 onActivityResult() 方法中处理目标页面返回的数据。
import android.content.Intent;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import com.alibaba.android.arouter.launcher.ARouter;
import com.alibaba.android.arouter.facade.callback.NavigationCallback;
public class MainActivity extends AppCompatActivity {
// ...
private void navigateToSecondActivity() {
ARouter.getInstance().build("/app/second").navigation(this, new NavigationCallback() {
@Override
public void onFound(Postcard postcard) {
}
@Override
public void onLost(Postcard postcard) {
}
@Override
public void onArrival(Postcard postcard) {
}
@Override
public void onInterrupt(Postcard postcard) {
// 目标页面返回时触发,处理返回的数据
if (postcard.getDestination().getPath().equals("/app/second")) {
Bundle extras = postcard.getExtras();
if (extras != null) {
String resultData = extras.getString("resultData");
// 在这里处理返回的数据
}
}
}
});
}
}
ARouter.getInstance().inject(this)` 是 ARouter 库中的一个方法,用于在目标页面中自动完成依赖注入操作。它可以帮助你在目标页面中轻松地获取通过 ARouter 传递的参数,而无需手动解析 Bundle 或 Intent。
三:ButterKnife
四:ButterKnife
五:ButterKnife