赞
踩
kotlin-android-extensions是由Kotlin团队研发的可以让开发更简单的插件。当前仅仅包括了view的绑定。这个插件自动创建了很多的属性来让我们直接访问XML中的view。这种方式不需要你在开始使用之前明确地从布局中去找到这些views。
如上所说kotlin-android-extensions的研发的主要目的是为了减轻代码中过渡繁琐的findViewById的使用。
在Android Studio4.1以前我们新建kotlin项目ide会自动给我们引入该插件的引用,我们只需要像往常一样在xml中进行布局,在需要使用的代码中引入对应库文件即可直接使用,详细可以看下方对比。
.xml文件内容如下:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="match_parent"
- android:layout_width="match_parent"
- android:gravity="center">
- <Button
- android:id="@+id/btn_test"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="测试"/>
- </LinearLayout>
- private var mTestBtn:Button
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
-
- mTestBtn= findViewById(R.id.btn_test) as Button
- mTestBtn.setOnClickListener {
- Toast.makeText(this@MainActivity,"success",Toast.LENGTH_SHORT).show()
- }
- }
以上为Android原生的视图绑定方式,使用findViewById进行关联控件id,最后强转类型。
- @BindView(R.id.btn_login)
- var mTestBtn:Button
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
-
- ButterKnife.bind(this)
-
- mTestBtn.setOnClickListener {
- Toast.makeText(this@MainActivity,"success",Toast.LENGTH_SHORT).show()
- }
- }
上述是使用以前普遍使用的ButterKnife视图绑定框架进行的方式,在使用上述代码时需要自行引入ButterKnife相关的依赖包。
这种就是我们说的Kotlin-Android-Extensions插件了,它的使用如下:
1、引入库插件,这一步在Android Studio4.1以前创建项目时ide会自动帮我们做了这件事情。
apply plugin: 'kotlin-android-extensions'
2、在需要绑定视图的Activity、Fragment、Adapter及自定义View中引入资源文件
import kotlinx.android.synthetic.main.activity_main.*
3、在使用的位置,直接使用xml中对应的id访问视图,完整代码如下:
- import kotlinx.android.synthetic.main.activity_main.*
-
- class MainActivity : AppCompatActivity() {
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
-
- btn_test.setOnClickListener {
- Toast.makeText(this@MainActivity,"success",Toast.LENGTH_SHORT).show()
- }
- }
- }
随着Android studio3.6的发布,我们发现google官方推出了新的一套框架,那就是ViewBinding。那他能干嘛呢,我们先看看官方的描述:
通过视图绑定功能,您可以更轻松地编写可与视图交互的代码。在模块中启用视图绑定之后,系统会为该模块中的每个 XML 布局文件生成一个绑定类。绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。
在大多数情况下,视图绑定会替代findViewById
。
也就是说我们通过使用ViewBinding也可以轻松的解决findViewById的繁琐使用问题,同样可以实现kotlin-android-extensions插件的类似功能。
其实同时还能在java和kotlin中同时使用,解决了kotlin-android-extensions插件使用所带来的问题。另外针对使用MVVM的朋友来说ViewBinding还可以和databinding配合使用,非常的方便。
所以是时候可以拥抱ViewBinding了~
1、项目集成
需要使用ViewBinding的功能,需要在对应的module的build.gradle文件中启用ViewBinding支持。
- android {
- ...
- viewBinding {
- enabled = true
- }
- }
如果您希望在生成绑定类时忽略某个布局文件,请将tools:viewBindingIgnore="true"
属性添加到相应布局文件的根视图中:
- <LinearLayout
- ...
- tools:viewBindingIgnore="true" >
- ...
- </LinearLayout>
2、在Activity中使用
如需设置绑定类的实例以供 Activity 使用,请在 Activity 的onCreate()方法中执行以下步骤:
- private ActivityMainBinding binding;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- binding = ActivityMainBinding .inflate(getLayoutInflater());
- View view = binding.getRoot();
- setContentView(view);
- }
配置后使用方式如下:
- binding.btnTest.setText("test");
- binding.button.setOnClickListener(new View.OnClickListener() {
- // todo
- });
3、在Fragment中使用
如需设置绑定类的实例以供 Fragment 使用,请在 Fragment 的onCreateView()方法中执行以下步骤:
- private ActivityMainBinding binding;
-
- @Override
- public View onCreateView (LayoutInflater inflater,
- ViewGroup container,
- Bundle savedInstanceState) {
- binding = ActivityMainBinding .inflate(inflater, container, false);
- View view = binding.getRoot();
- return view;
- }
-
- @Override
- public void onDestroyView() {
- super.onDestroyView();
- binding = null;
- }

配置后使用方式如下:
- binding.btnTest.setText("test");
- binding.button.setOnClickListener(new View.OnClickListener() {
- // todo
- });
4、在Adapter中使用ViewBinding
我们以在Recyclerview的adapter中使用ViewBinding为例,代码如下:
- public class MainAdapter extends RecyclerView.Adapter<MainAdapter.ViewHolder> {
-
- private List<String> mList;
-
- public MainAdapter(List<String> list) {
- mList = list;
- }
-
- @NonNull
- @Override
- public MainAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
- //之前的写法
- //View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_comment, parent, false);
- //ViewHolder holder = new ViewHolder(view);
-
- //使用ViewBinding的写法
- LayoutCommentBinding commentBinding = LayoutCommentBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
- ViewHolder holder = new ViewHolder(commentBinding);
- return holder;
- }
-
- @Override
- public void onBindViewHolder(@NonNull MainAdapter.ViewHolder holder, int position) {
- holder.mTextView.setText(mList.get(position));
- }
-
- @Override
- public int getItemCount() {
- return mList.size();
- }
-
- static class ViewHolder extends RecyclerView.ViewHolder {
-
- TextView mTextView;
-
- //之前的写法
- //public ViewHolder(@NonNull View itemView) {
- // super(itemView);
- // mTextView = itemView.findViewById(R.id.tv_include);
- //}
-
- //使用ViewBinding的写法
- ViewHolder(@NonNull LayoutCommentBinding commentBinding) {
- super(commentBinding.getRoot());
- mTextView = commentBinding.tvInclude;
- }
-
- }
- }

这里需要注意两个地方:
以上为kotlin-android-extensions和ViewBinding的简单介绍说明,其实在最后我们使用ViewBinding的过程中,也难免会发现有很多地方在进行inflate的使用,所以建议大家在使用的过程中将ViewBinding的inflate初始化绑定操作进行二次封装后使用,这样才算是真正的简化了这部分的代码。
关于二次封装,大家有兴趣可以自行尝试,我相信现在网上也有很多大牛有非常不错的封装方式了,后续我也会将我自己简单的封装方式分享出来~
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。