在大部状况下,使用ViewBinding替换findViewById。之前若是不使用第三方框架, 无论怎样封装,使用起来仍是很不方便(好比找不到控件、控件ID冲突等问题)java
android {
...
viewBinding {
enabled = true
}
}
复制代码
<LinearLayout
...
tools:viewBindingIgnore="true" >
...
</LinearLayout>
复制代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:textSize="24sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
复制代码
接着就能够在Activity里面进行使用 XXXBinding 类,该类提供了三个初始化函数android
fun inflate(inflater: LayoutInflater): XXXBinding
fun inflate(inflater: LayoutInflater, parent: ViewGroup, attachToParent: boolean): XXXBinding
fun bind(view: View): XXXBinding
复制代码
添加一个ActivityMainActivity.kt,代码以下markdown
class MainActivity:BaseActivity() {
private val tag:String ="MainActivity"
private lateinit var viewbinding:ActivityMainBinding
private lateinit var button:Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d(tag, "onCreate:$SPLASH_TIME")
}
override fun observerViewModel() {
}
override fun initViewBinding() {
viewbinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(viewbinding.root)
}
override fun initViews() {
button = viewbinding.buttonMain
button.setOnClickListener {
navigationLoginActivity()
}
}
private fun navigationLoginActivity(){
startActivity(Intent(this,LoginActivity::class.java))
}
}
复制代码
先添加一个布局文件fragment_view_binding.xml,代码不列出了:app
添加一个Fragment,ViewBindingFragment,代码以下:框架
public class ViewBindingFragment extends Fragment {
private FragmentViewBindingBinding binding;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
binding = FragmentViewBindingBinding.inflate(inflater, container, false);
View view = binding.getRoot();
binding.tvContent.setText("这里是在Fragment经过ViewBinding设置的文本");
return view;
}
public static ViewBindingFragment newInstance() {
Bundle args = new Bundle();
ViewBindingFragment fragment = new ViewBindingFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
}
复制代码
在Fragment中使用ViewBinding时,要在**onDestroyView()**方法中把binding的引用移除,否则会引发内存泄漏;ide