版权声明:本文为博主原创文章,未经博主允许不得转载。
https://www.jianshu.com/p/ccb0d850577b
前言:北京时间2020年2月26日,Android Studio 正式版迎来了版本更新 Version 3.6。
访问视图的方法 | 简明 | 编译安全 | 编译速度 |
---|---|---|---|
findViewById | Yes | ||
Databinding | Yes | Yes | |
Butter Knife | Yes | ||
Kotlin Synthetic | Yes | Yes | |
??? | Yes | Yes | Yes |
在简明、编译安全和编译速度上都各有优势,那么有没有一个三合一的方法呢?在今天(2020年2月26日)我们可以正式使用这个方法 —— View Binding
官方文档:https://developer.android.google.cn/topic/libraries/view-binding
首先将 Android Studio 更新到 3.6 正式版
之后在 build.gradle 里开启 View Binding(和 Databinding 相似)
android {
...
viewBinding {
enabled = true
}
}
使用 View Binding 在 Activity 和 Fragment 里是有区别的,所以分开讲解。
Java 写法,在 Activity 里使用 View Binding
1.自定义布局
<TextView android:id="@+id/text_view_activity_java" />
2.在 Activity 里绑定布局
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding mActivityBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mActivityBinding = ActivityMainBinding.inflate(getLayoutInflater());
View view = mActivityBinding.getRoot();
setContentView(view);
}
}
3.给控件设置内容
mActivityBinding.textViewActivityJava.setText("View Binding Java Activity.");
Java 写法,在 Fragment 里使用 View Binding
1.自定义布局
<TextView android:id="@+id/text_view_fragment_java" />
2.在 Fragment 里绑定布局
public class MainFragment extends Fragment {
private FragmentMainBinding mFragmentBinding;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
mFragmentBinding = FragmentMainBinding.inflate(inflater, container, false);
View view = mFragmentBinding.getRoot();
return view;
}
@Override
public void onDestroyView() {
super.onDestroyView();
mFragmentBinding = null;
}
}
注:一定要在 onDestroyView 的时候清除对绑定实例的所有引用
3.给控件设置内容
mFragmentBinding.textViewFragmentJava.setText("View Binding Java Fragment.");
Kotlin 写法,在 Activity 里使用 View Binding
1.自定义布局
<TextView android:id="@+id/text_view_activity_kotlin" />
2.在 Activity 里绑定布局
class MainActivity : AppCompatActivity() {
private lateinit var mBinding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mBinding = ActivityMainBinding.inflate(layoutInflater)
val view = mBinding.root
setContentView(view)
}
}
3.给控件设置内容
mBinding.textViewActivityKotlin.text = "View Binding Kotlin Activity."
Kotlin 写法,在 Fragment 里使用 View Binding
1.自定义布局
<TextView android:id="@+id/text_view_fragment_kotlin" />
2.在 Fragment 里绑定布局
class MainFragment : Fragment() {
private var _binding: FragmentMainBinding? = null
private val mBinding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentMainBinding.inflate(inflater, container, false)
val view = mBinding.root
return view
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
3.给控件设置内容
mBinding.textViewFragmentKotlin.text = "View Binding Kotlin Fragment"
与 findViewById 的区别
与使用 findViewById 相比,视图绑定具有一些很显著的优点:
空安全、类型安全。
与 Databinding 的区别
Databinding 仅处理使用 <layout> 代码创建的数据绑定布局。
View Binding 不支持布局变量或布局表达式,因此它不能用于在 XML 中将布局与数据绑定。
网友评论