View BindingとData Binding

10541 ワード


Android Kotlinから
1.通常、ビューを制御する方法は次のとおりです.
2.View Bindingを使用してこのプロセスを簡略化する方法
3.ViewModelと連携した効率的なデータバインディングの使用方法をまとめる

0、準備


Buttonをクリックすると、EditTextの内容をTextViewに出力するには3つの方法があります.

1.基礎制御方法


findViewByIdメソッドを使用してビューオブジェクトを取得し、次のようにビューのget/setメソッドを呼び出して制御します.
var textView = findViewById<TextView>(R.id.textView1)
textView.text = "this is TextView"

findViewById<Button>(R.id.button1).setOnClickListener{
    val editText : String = findViewById<EditText>(R.id.editText1).text.toString()
    findViewById<TextView>(R.id.textView1).text = editText
}
    
ここでfindViewメソッドを呼び出すたびに
1.書くたびに面倒なことがあるので、
2.ビュー内で全プロセスの検索が行われているため、速度が遅い.
3.欠点は安全ではないことです.

kotlin-android-extension(synthetic)


その後kotlin-android-extensionという機能が追加され、下図のようにgradleにpluginが追加され、MainActivityでインポートする場合はfindView ByIdを使用する必要はありません.内部キャッシュにより再利用率が向上したそうです.
build.gradle
plugins {
    id 'kotlin-android-extensions'
}
Activity
import kotlinx.android.synthetic.main.activity_main.*
...
textView1.text = "this is TextView"
しかし、以下の欠点から、コートリンバージョン1.4.20はサポートを停止し始めた.
  • null-safe有限、
  • 同じIDを有する他のレイアウト(
  • )、
  • を参照することもできる.
  • kotlinでのみ使用できます.
  • 以上の欠点を補うために提案したのが,ViewBindingとDataBindingである.
    グーグルもこの2つの方法で開発することを提案している.
    それぞれの特徴を理解してください.

    2.View Bindingによる制御


    View BindingはAndroid Studio 3.6から提供されています
    build.gradle
    android {
        ...
        
        // Binding 설정
        buildFeatures{
            viewBinding = true
        }
    }
    このように適用すると、XMLファイルのオブジェクトが作成されます.
    (ex.activity main.xml->Activity MainBindingオブジェクト)
    XMLファイルでtools:viewBindingIgnore="true"を使用している場合、XMLのバインドクラスは生成されません.
    MainActivity
    
    private lateinit var binding : ActivityMainBinding
    ...
    
    override fun onCreate(savedInstanceState: Bundle?) {
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
            
        binding.textView1.text = "this is TextView"
    
        binding.button1.setOnClickListener{
            binding.textView1.text =binding.editText1.text
            }
        }
    }
    上記の「ベース制御メソッド」コードに比べて、使用方法がより明確で簡潔であることがわかります.
    現在のコードは3つのビューしかないため、コード量にはあまり差がないように見えるかもしれませんが、それ以上であれば差が感じられます.
    また、xmlとbindingオブジェクトは1:1で一致するため、kotlin-android-extensionは同じIDを持つ他のレイアウトを参照することはできません.

    3.DataBindingによる制御(MVVMモード使用)


    DataBindingはAndroid Studio 3.6から提供
    build.gradle
    android {
        ...
        
        // Binding 설정
        buildFeatures{
            dataBinding = true
        }
    }
    DataBindingも、ViewBindigと同じxml用Bindingオブジェクトを生成します.
    このため、ViewBindingのように使用することができますが、このように使用すると、DataBindingの特徴を使用しているとは考えられません.
    DataBindingの特徴をもっとよく表現しましょう
    activity_main.xmlをレイアウトラベルとしてカプセル化し、データラベル宣言後に変数ラベルを宣言します.
    次に、ViewModelオブジェクトを変数として挿入します.
    注意すべきは、EditTextに@={activity.text 2}と書かれていることです.
    これは、Fragment->XML方向にバインドするだけでなく、Fragment<->XMLのように双方向バインドすることを意味します.(DataBindingのメリット)
    fragment_main.xml
    <?xml version="1.0" encoding="utf-8"?>
    <layout 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" >
    
        <data>
            <variable
                name="vm"
                type="com.example.viewcontrolbindingtest.viewmodel.MainViewModel" />
        </data>
    
        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".MainActivity">
    
            <TextView
                ...
                android:text="@{vm.text1}"
                ... />
    
            <EditText
                ...
                android:text="@={vm.text2}"
                ... />
                
            <Button
                ...
                android:onClick="@{() -> vm.onSaveClick()}"
                ... />
               
        </androidx.constraintlayout.widget.ConstraintLayout>
    </layout>
    ViewModel
    class MainViewModel : ViewModel() {
        private val _text1 = MutableLiveData<String>()
        val text1 : MutableLiveData<String> = _text1
        ...
        
        fun onSaveClick(){
        ...
        }
    }
    分割セクションを作成し、ViewModelをbindingオブジェクトに接続します.これによりMVVM構造を作成できます.
    接続後、XMLではViewModelの変数とメソッドを自由に使用できます.また、lifecycleOwnerを対応するパーティションに登録して、ViewModelのデータが変更されたときにビューを更新することもできます.
    Fragment
    private val viewModel: MainViewModel by viewModels()
    private lateinit var binding : MainFragmentBinding
    
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding = MainFragmentBinding.inflate(inflater,container,false).apply {
            vm = viewModel
            lifecycleOwner = this@MainFragment
        }
        return binding.root
    }
    もし私たちがここまで来たら、私たちはViewをコントロールする3つの方法を感じます.
    上記単独使用時と比較して、DataBinding
    Data Class、View Modelなどと併用しており、MVVMモードを構築する際に有効です.