赞
踩
ViewBinding是一个新的库,可以替代findViewById()来绑定视图。它是一种类型安全的、可空的方式来访问视图层次结构中的视图。与ButterKnife等其他绑定库相比,ViewBinding是由Google官方提供的,并且使用起来更加简单。
使用ViewBinding步骤如下:
android {
...
buildFeatures {
viewBinding true
}
}
dependencies {
...
implementation 'com.android.support:viewbinding:28.0.0-alpha1'
}
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<LinearLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</LinearLayout>
</layout>
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.container.setOnClickListener {
binding.textView.text = "You clicked me!"
}
}
}
在这个例子中,我们使用ActivityMainBinding来绑定activity_main.xml中的视图。通过inflate()方法创建绑定对象,然后使用setContentView()方法设置根视图。此后,我们可以像访问一个正常的布局一样访问视图。
使用ViewBinding的主要好处是避免了许多模板代码,并且可以避免在运行时发生NullPointerException,因为它使用了Kotlin的可空类型。
在Activity中使用ViewBinding,需要在build.gradle文件中添加以下依赖项:
android {
...
buildFeatures {
viewBinding true
}
...
}
dependencies {
...
implementation 'com.android.support:viewbinding:28.0.0'
}
接下来,在Activity的布局文件中添加以下代码:
<LinearLayout
...
>
<TextView
android:id="@+id/textView"
...
/>
<Button
android:id="@+id/button"
...
/>
</LinearLayout>
在Activity中使用ViewBinding时,首先需要在Activity中声明一个ViewBinding的对象,在onCreate()方法中进行初始化:
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
}
接下来就可以使用binding对象来操作布局中的控件了:
binding.textView.setText("Hello World!");
binding.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// do something
}
});
需要注意的是,ViewBinding会根据布局文件中控件的id为这些控件生成对应的变量名,因此在使用时需要使用camelCase的命名方式,比如findViewById(R.id.text_view)
对应的ViewBinding变量名为binding.textView
。
另外,需要注意的是,如果Activity中存在多个布局文件,需要使用对应的ViewBinding对象来操作不同的布局文件中的控件,例如:
private ActivityMainBinding mainBinding;
private ActivityOtherBinding otherBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainBinding = ActivityMainBinding.inflate(getLayoutInflater());
otherBinding = ActivityOtherBinding.inflate(getLayoutInflater());
setContentView(mainBinding.getRoot()); // 设置默认布局
}
private void switchLayout(boolean isMain) {
if (isMain) {
setContentView(mainBinding.getRoot());
} else {
setContentView(otherBinding.getRoot());
}
}
在Fragment中使用ViewBinding,需要在Fragment的onCreateView方法中进行以下步骤:
private var binding: FragmentExampleBinding? = null
binding = FragmentExampleBinding.inflate(inflater, container, false)
return binding?.root
override fun onDestroyView() {
super.onDestroyView()
binding = null
}
完整示例代码:
class ExampleFragment : Fragment() {
private var binding: FragmentExampleBinding? = null
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentExampleBinding.inflate(inflater, container, false)
return binding?.root
}
override fun onDestroyView() {
super.onDestroyView()
binding = null
}
}
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。