[Android Jetpack]データバインドデータのバインド


DataBindingはいつ使いますか?

Data Bindingの概念は、Android設計モードにおけるMVVMモードにおいても同様に言及される.
ViewでView Modelを観察し、変更したデータをUIにバインドするときに使用します.

👍🏻 長所

    findViewById<TextView>(R.id.sample_text).apply {
        text = viewModel.userName
    }
Androidでは、上記のコードのようにActiviyFragmentなどのUIコンポーネントにレイアウトを接続し、레이아웃 안의 View의 idの値を検索する必要があります.
ただし、dataBindingを使用すると、宣言を必要とせずにlayoutで直接データをマージできます.これにより、より多くのコードが得られます.減少する.

DataBindingの使用


pulse、minus、resetボタンは、テキスト値の例を変更できます.DataBindingと共にViewModelLiveDataを使用する.

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は最高のレイアウトで、中にはButton3個と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〉結果



    完全なコードはここ!ですBindingAdapterRecyclerViewを使う方法をまとめてみましょう!
    リファレンス
  • Android公式ドキュメント