概述
dataBinding
双向绑定,viewBinding
单向绑定.它用来替代findViewById()
,可以看作轻量级的dataBinding
. Kotlin中虽有synthetic特性,方便获取控件引用.但这个特性作用的范围是全局的, 很容易不小心引入其他布局中的控件引用造成空指针.
注意事项
Android Studio 3.6及以上才支持viewBinding
. 在Studio版本为3.6及以上时,还需要保证classpath
在com.android.tools.build:gradle:3.6.0
以上,否则会报错.
Could not find method viewBinding() for arguments [build_avr407103co4pp1wtvc9g3xyy$_run_closure1$_closure5@1ad89b9c] on object of type com.android.build.gradle.internal.dsl.BaseAppModuleExtension.
classpath
在com.android.tools.build:gradle:3.6.0
以上时,还要保证gradle版本在gradle-5.6.4-all
以上.
使用
配置
android {
// 相应的Module APP下的gradle中配置
viewBinding {
enabled = true
}
}
Activity中用法
XML布局文件,xml的文件名称为:activity_main_1.xml
<?xml version="1.0" encoding="utf-8"?>
< RelativeLayout 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"
tools: context= " .MainActivity" >
< TextView
android: id= " @+id/tv1"
android: layout_width= " match_parent"
android: layout_height= " 40dp" />
< TextView
android: id= " @+id/tv2"
android: layout_width= " match_parent"
android: layout_height= " 40dp" />
</ RelativeLayout>
MainActivity中用法
public class MainActivity extends AppCompatActivity {
private ActivityMain1Binding binding;
@Override
protected void onCreate ( Bundle savedInstanceState) {
super . onCreate ( savedInstanceState) ;
binding = ActivityMain1Binding. inflate ( getLayoutInflater ( ) ) ;
setContentView ( binding. getRoot ( ) ) ;
binding. tv1. setText ( "1" ) ;
binding. tv2. setText ( "2" ) ;
}
}
Fragment中用法
XML布局,xml的文件名称为:first_fragment_1.xml
<?xml version="1.0" encoding="utf-8"?>
< LinearLayout xmlns: android= " http://schemas.android.com/apk/res/android"
android: layout_width= " match_parent"
android: layout_height= " match_parent"
android: orientation= " vertical" >
< TextView
android: id= " @+id/tv1"
android: layout_width= " match_parent"
android: layout_height= " 40dp" />
< TextView
android: id= " @+id/tv2"
android: layout_width= " match_parent"
android: layout_height= " 40dp" />
</ LinearLayout>
FirstFragment中用法
public class FirstFragment extends Fragment {
private static final String TAG = FirstFragment. class . getName ( ) ;
private FirstFragment1Binding binding;
@Nullable
@Override
public View onCreateView ( @NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding= FirstFragment1Binding. inflate ( getLayoutInflater ( ) ) ;
binding. tv1. setText ( "1" ) ;
binding. tv2. setText ( "1" ) ;
return binding. getRoot ( ) ;
}
}
参考资料一 参考资料二 参考资料三