在大部狀況下,使用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