[Android Jetpack]データバインドデータのバインド
DataBindingはいつ使いますか? Data Binding
の概念は、Android設計モードにおけるMVVM
モードにおいても同様に言及される.
ViewでView Modelを観察し、変更したデータをUIにバインドするときに使用します.
👍🏻 長所
findViewById<TextView>(R.id.sample_text).apply {
text = viewModel.userName
}
Androidでは、上記のコードのようにActiviy
、Fragment
などのUIコンポーネントにレイアウトを接続し、레이아웃 안의 View의 id
の値を検索する必要があります.
ただし、dataBindingを使用すると、宣言を必要とせずにlayoutで直接データをマージできます.これにより、より多くのコードが得られます.減少する.
DataBindingの使用
pulse、minus、resetボタンは、テキスト値の例を変更できます.DataBinding
と共にViewModel
LiveData
を使用する.
1」構築環境
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-kapt' // 추가!
}
android {
...
dataBinding {
enabled = true
}
}
アプリケーションモジュールのbuild.gradle
にplugin android-kapt
を追加し、dataBinding
要素の追加
2朕修正xml
変更前のアクティブmain。xml
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn_reset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_reset"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/btn_minus"
app:layout_constraintTop_toTopOf="@+id/btn_minus"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/btn_minus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:text="@string/btn_minus"
app:layout_constraintEnd_toStartOf="@+id/btn_reset"
app:layout_constraintStart_toEndOf="@+id/btn_plus"
app:layout_constraintTop_toBottomOf="@+id/tv_number" />
<Button
android:id="@+id/btn_plus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_plus"
app:layout_constraintEnd_toStartOf="@+id/btn_minus"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/btn_minus" />
</androidx.constraintlayout.widget.ConstraintLayout>
ConstraintLayout
は最高のレイアウトで、中にはButton
3個とTextView
があります.
変更後activity main。xml
findViewById<TextView>(R.id.sample_text).apply {
text = viewModel.userName
}
pulse、minus、resetボタンは、テキスト値の例を変更できます.
DataBinding
と共にViewModel
LiveData
を使用する.1」構築環境
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-kapt' // 추가!
}
android {
...
dataBinding {
enabled = true
}
}
アプリケーションモジュールのbuild.gradle
にplugin android-kapt
を追加し、dataBinding
要素の追加2朕修正xml
変更前のアクティブmain。xml
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn_reset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_reset"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/btn_minus"
app:layout_constraintTop_toTopOf="@+id/btn_minus"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/btn_minus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:text="@string/btn_minus"
app:layout_constraintEnd_toStartOf="@+id/btn_reset"
app:layout_constraintStart_toEndOf="@+id/btn_plus"
app:layout_constraintTop_toBottomOf="@+id/tv_number" />
<Button
android:id="@+id/btn_plus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_plus"
app:layout_constraintEnd_toStartOf="@+id/btn_minus"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/btn_minus" />
</androidx.constraintlayout.widget.ConstraintLayout>
ConstraintLayout
は最高のレイアウトで、中にはButton
3個とTextView
があります.変更後activity main。xml
<layout>
<data>
<variable
name="viewmodel"
type="com.example.mvvm2.viewmodel.MainViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout > ...
</>
</layout>
まず一番上のレイアウトをLayout
に変更します.次の
<data>
に<variable>
を入れ、このxmlの変数classを使用します.タイプとともに宣言する.
LiveDataとともに使用するため、ViewModelクラスの変数を使用するため、ViewModelを発表しました.
<TextView
android:id="@+id/tv_number"
android:text="@{viewmodel.number.toString()}"
... />
<Button
android:id="@+id/btn_reset"
android:onClick="@{() -> viewmodel.resetNumber()}"
.../>
各構成部品には、Databindingのレイアウトとマージ式を使用してレイアウト内のビューとデータを結合する値を指定する必要があります.@{}
の構文を使って、属性の中で適切に使えばいいです!3」UIでBindingを発表
修正前のMainActivity。kt
class MainActivity : AppCompatActivity(), View.OnClickListener {
private lateinit var mainViewModel : MainViewModel
private val btnPlus : Button by lazy { findViewById<Button>(R.id.btn_plus)}
private val btnMinus : Button by lazy { findViewById(R.id.btn_minus)}
private val btnReset : Button by lazy { findViewById(R.id.btn_reset) }
private val tvNumber : TextView by lazy { findViewById(R.id.tv_number)}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var binding : ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
//ViewModel 객체 생성
mainViewModel = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory()).get(MainViewModel::class.java)
//LiveData(number)에 ViewModel 연결
mainViewModel.number.observe(this, Observer {
tvNumber.text = it.toString()
})
btnPlus.setOnClickListener(this)
btnMinus.setOnClickListener(this)
btnReset.setOnClickListener(this)
}
override fun onClick(view: View?) {
when(view){
btnPlus -> mainViewModel.plusNumber()
btnMinus-> mainViewModel.minusNumber()
btnReset -> mainViewModel.resetNumber()
}
}
}
変更前のコードを表示し、findViewByID
を使用してxmlのレイアウトを検索できます.Onclick
リスナーを継承し、viewmodelの関数を呼び出してクリックイベント処理を行う.TextViewを更新するには、TextViewのデータビューモデルのLiveDataを観察するコードが必要です.
DataBindingのMainActivityを使用します。kt
class MainActivity : AppCompatActivity(){
private lateinit var mainViewModel : MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var binding : ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
//ViewModel 객체 생성
mainViewModel = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory()).get(MainViewModel::class.java)
binding.viewmodel = mainViewModel
binding.lifecycleOwner = this
}
}
前のコード数より多い!減りました.findViewById
で構成部品を接続する必要はなく、ViewModelのLiveDataを観察する必要もありません.2日にライブデータをそのままビューに結合したので!!!! binding.viewmodel = mainViewModel
2番目のコードに<variable>
に設定されたnameと実際のclassを接続します.viewModelを直接観察する必要もありません.
4〉結果
完全なコードはここ!です
BindingAdapter
とRecyclerView
を使う方法をまとめてみましょう!リファレンス
Reference
この問題について([Android Jetpack]データバインドデータのバインド), 我々は、より多くの情報をここで見つけました https://velog.io/@ashwon1218/Android-Jetpack-Data-Binding-데이터-바인딩テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol