Android框架之依赖注入(ButterKnife、Binding)

ButterKnife

ButterKnife是一个专注于Android系统的View注入框架,本来需要使用findViewById去找到View对象,非常的繁琐麻烦,有了ButterKnife就可以省去一大串的代码,只需要@BindView就可以了,十分简洁。
ButterKnife项目地址
下面就简单介绍一下ButterKnife最常用的方法

第一步:导入BufferKnife包

在build.gradle(:app)的dependencies里添加如下依赖

dependencies {
	...
    // butterknife
    implementation'com.jakewharton:butterknife:10.2.3'
    annotationProcessor'com.jakewharton:butterknife-compiler:10.2.3'
}

如果使用的是Kotlin,需要把annotationProcessor替换为kapt
还要注意的是在build.gradle(:app)的android里是否有下面的代码

android {
  	...
  	// Butterknife requires Java 8.
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

Butterknife需要启用Java 8。
在这里插入图片描述
添加了依赖包以后一定要Sync Now一下去下载
在这里插入图片描述

第二步:绑定控件

    @BindView(R.id.text_view_tv)//绑定控件
    TextView mTextViewTv;

第三步:绑定Activity

        //绑定处理
        ButterKnife.bind(this);

总结

总的代码
ButterKnifeActivity.java

/**
 * ButterKnife
 */
public class ButterKnifeActivity extends AppCompatActivity {

    @BindView(R.id.text_view_tv)//绑定控件
    TextView mTextViewTv;
    @BindView(R.id.edit_text_edit)
    EditText mEditTextEdit;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_butter_knife);

        //绑定处理
        ButterKnife.bind(this);
    }

    //点击事件处理
    @OnClick(R.id.button_btn)
    public void onViewClicked() {
        mTextViewTv.setText(mEditTextEdit.getText());
    }
}

activity_butter_knife.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical">

    <TextView
        android:id="@+id/text_view_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

    <EditText
        android:id="@+id/edit_text_edit"
        android:layout_width="150dp"
        android:layout_height="50dp"
        android:textColor="@color/white"
        android:background="#999999"
        android:hint="请输入" />

    <Button
        android:id="@+id/button_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

</LinearLayout>

运行
在这里插入图片描述
以上是ButterKnife在Activity里的使用。
ButterKnife在Fragment使用时,由于Fragment的生命周期不同于activity,在onCreateView()中绑定一个Fragment时,需要在onDestroyView()中通过调用Unbinder的unbind方法将对其进行解绑
值得注意的是,在使用BufferKnife的时候,不能用private or static修饰,否则会报错。

Binding

Android Studio稳定版发布了3.6版本支持全新的视图绑定组件View Binding,可以不用使用findViewById啦。
在模块中启用视图绑定之后,系统会为该模块中的每个 XML 布局文件生成一个绑定类。绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。
官方文档

启用View Binding

在这里插入图片描述

android {
	...
    viewBinding {
        enabled = true
    }
}

如果希望在生成绑定类时忽略某个布局文件,就可以在相应布局文件的根视图中添加
在这里插入图片描述

<LinearLayout
            ...
            tools:viewBindingIgnore="true" >
        	...
</LinearLayout>

使用

系统生成绑定类的名称是:将 XML 文件的名称转换为驼峰式大小写,并在末尾添加“Binding”一词。
比如activity_view_binding.xml生成的类的名称是ActivityViewBindingBinding

在 Activity 中使用视图绑定

/**
 * ViewBinding
 */
public class ViewBindingActivity extends AppCompatActivity {

  	//activity_view_binding生成的类的名称是ActivityViewBindingBinding
    private ActivityViewBindingBinding mBinding;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_binding);

        //调用生成的绑定类中包含的静态inflate()方法。此操作会创建该绑定类的实例以供Activity使用
        mBinding = ActivityViewBindingBinding.inflate(getLayoutInflater());
        //通过调用getRoot()方法获取对根视图的引用
        View view = mBinding.getRoot();
        //将根视图传递到setContentView(),使其成为屏幕上的活动视图
        setContentView(view);

        //使用
        mBinding.buttonBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mBinding.textViewTv.setText(mBinding.editTextEdit.getText());
            }
        });
    }

}

activity_view_binding.xml布局如前文ButterKnife

在 Fragment 中使用视图绑定

    private ResultProfileBinding binding;

    @Override
    public View onCreateView (LayoutInflater inflater,
                              ViewGroup container,
                              Bundle savedInstanceState) {
        binding = ResultProfileBinding.inflate(inflater, container, false);
        View view = binding.getRoot();
        return view;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        binding = null;
    }

使用都和Activity中一样
Fragment 的存在时间比其视图长。请务必在 Fragment 的 onDestroyView() 方法中清除对绑定类实例的所有引用。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值