Android Binding (ViewBinding, DataBinding)


ViewBinding


ViewBindingを使用すると、ビューとインタラクティブなコードを簡単に作成でき、ViewBindingは各XMLレイアウトファイルのBindingクラスを生成します.Bindingクラスのインスタンスは、レイアウト内のIDを持つすべてのビューを直接参照できます.
すなわちfindViewByIDを簡単に使用するのではなく、XMLにアクセスするviewコンポーネントのobjectを返すことでviewにアクセスする.ここで、ObjectはAndroid Studioによって自動的に作成されます.
findViewByIdリファレンスを使用するには、エラーファイルからXMLファイル<TextView>にアクセスしようとすると
val textview  = findViewById<TextView>(R.id.example_tv)
        textview.text = "바꾼 텍스트"
このように変数を逐一宣言しなければならない.findViewByIdはNull point Exception(Null値を処理できない)を生成する可能性がありますが、参照するviewコンポーネントが多いとコード量が非常に大きくなるためbinding機能を使用するのは面倒です.
また,ビューバインド操作を必要とせずにidを変数として直接使用できるKotlinシステムが出現したが,まだ安定していないため廃棄された.
を選択します.
  • build.gradleで有効にします.(追加libarry不要)
  • すべてのレイアウトにbindingオブジェクト
  • が作成されます.
  • Binding objectは、idを持つすべてのビューを属性とします.
  • typeも自動生成され、findViewByIdもnullは生成されません.(null-safety)
  • java、kotlinともにサポートされています.
  • ViewBindingの使用


    build.勾配を追加

  • のAndroid Studioバージョン4.0以降のテンポラリ
  • を使用
    android {
    	...
        buildFeatures {
        	viewBinding = true
        	}
        }
  • のAndroid Studioバージョン3.6~4.0
  • を使用
    android {
    	...
        viewBinding{
          enabled true
          }
        }
    ViewBindingオプションを有効にすると、プロジェクト内のレイアウトファイルにBindingクラスが生成され、各ファイルに宣言されたビューのid参照がクラスに含まれます.

    アクティビティでのViewBindingの使用

  • activity_main_xml
  • 二つのTextView(IDは例1、例2)
  • 単一ボタン(id:button)
  • 次の場合に使用できます.
    override fun onCreate(savedInstanceState: Bundle?) {
    	super.onCreate(savedInstanceState)     
    	val binding = ActivitymainBinding.inflate(layoutInflater)
    	binding.example1.text = "Hello"
    	binding.example2.text = "Concise, safe code"
    	binding.button.setOnClickListener { /* ... */ }      
        	setContentView(binding.root) } 
    
    上記のコードに基づいて、各ビューのidは属性として提供されます.
    xml全体をカプセル化する最上位の親にrootというプロパティを提供します.したがって、setContentViewのパラメータを使用することができます.
    setContentViewのパラメータとしてrootを使用する必要があります!!!
    viewBindingを使用し、setContentViewに既存の方法でR.layoutを行う場合.ユーザーにactivityMainを渡すと、レイアウト膨張が2回行われます.膨張したルートとレイアウトオブジェクトは異なるオブジェクトなので、異なるビューを指します->所望の動作は発生しない.
    viewBindingを使用するには
    setContnetView(binding.root)

    FragmentでのViewBindingの使用


    計画でviewBindingを使用するには、計画のonCreateView()メソッドで
    1.生成されたBindingクラスに含まれる膨張()メソッドを呼び出します.これにより、バインドクラスインスタンスが作成され、このインスタンスで使用できます.
    2.getRoot()メソッドを呼び出してルートビュー参照を取得します.
    3.onCreateView()メソッドでは、root Viewを画面アクティブビューに戻します.
    class LockerFragment : Fragment() {
    
        private var _binding: FragmentLockerBinding? = null	// 처음에 null로 값 할당해주기
        
        private val binding get() = _binding!! // 이 binding은 onCreateView와 onDestroyView 사이에서만 유효하다.
    
        override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View {
            _binding = FragmentLockerBinding.inflate(inflater, container, false)
            val view = binding.root
            return view
        }
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
            binding.textView11.text = "안녕"
        }
        override fun onDestroyView() {
            super.onDestroyView()
            _binding = null
        }
    }
    
    最初にbindingをnullに割り当て、onCreateViewとonDestroyViewの間でのみ有効なbindingを宣言し、ondestroyViewがbindingをnullに再初期化したのはFragmentのライフサイクルのためです.計画は風景より長く生きる.Bindingクラスにはビューへの参照があり、ビューが削除されると(=onDestroyView)Bindingクラスのインスタンスも整理されます.
    詳細は、計画のライフサイクルを学習する際に再考します.

    What code does it generate?



    上の画像をクリックすると詳細な説明が表示されます.(ソースhttps://tourspace.tistory.com/314)
    上のリンクで実際のViewbindingオプションが有効になっている場合は、Android Studioのどのコードがアクティブ化時に実行されているかを知ることができます.
    各bindingオブジェクトには3つの静的関数があります.
  • 膨張(膨張器):ActivityのonCreateで使用され、親ビューに渡すコンテンツがない場合に使用されます.
  • 膨張:親ビューグループをスキップする必要がある分割またはRecyclerViewのAdapter(またはView Holder)など.
  • bind(rootView):ビューが膨張している場合はfindViewByIdを回避するか、既存のコードを再構築するときに使用できます.
  • View Binding完了

  • Null信頼性:開発者が誤って無効なIDを使用したときに空のエラーが発生することを防止する
  • .
  • タイプの安定性:TextViewタイプが正しく選択されていないとcast異常を引き起こす可能性があります.
  • 速度はfindViewByIdより速い.
  • viewBindingはfindViewByIdに代わる方法としてのみ使用されます.したがって、既存のデータバインドとビューバインドを同じモジュールで同時に使用できます.
    (ViewBindingは、DataBindingを使用しない単純な使用要求によって開発されています.)

    DataBinding


    バインディングDataBinding:データのグループ化(連結)
    これは、プログラムで接続するのではなく、ユーザーインタフェース要素とデータを宣言形式で結合するのに役立つライブラリです.

    プログラム性と宣言性


    レイアウトは、通常、ビュー付きXMLファイルに関連付けられたアクティビティで定義されます.たとえば、次のコードはfindViewById()を呼び出してTextViewコンポーネントを検索し、viewModel変数のuserNameプロパティにバインドします.
    コードに値を入力して
  • TextView(プログラム化)
  • に文字列を入れる.
    // findViewById 방식
    val textview = findViewById<TextView>(R.id.textview11)
    textview.text = "안녕"
    // ViewBinding 방식
    binding.textview11.text = "안녕"
        
  • XMLにコード(宣言)
  • を直接挿入する方法
    <TextView
    	android:layout_width="match_parent"
        	android:layout_height="wrap_content"
            android:text="@{viewmodel.userName}" />
            
    宣言方法->アクティビティは論理保持コードのみであり、ビューに関連するアクションはレイアウトファイルで定義されます.
    すなわち,レイアウトにおいて接続データとビューの操作を処理する技術をdatabindingと呼ぶ.

    DataBindingの使用


    build.勾配を追加

  • Android Studio 4.0以降
  • // Android Studio 4.0 이상
    adroid{
    	...
        buildFeatures {
        	dataBidning = true
            }
    }
  • Android Studio 3.6 ~ 4.0
  • // Android Studio 3.6 ~ 4.0
    adroid{
    	...
        dataBinding {
        	enabled true
            }
    }

    ActivityでのDataBindingの使用


    アクティビティでDataBindingを使用します.
  • 先app/build.gradleにdataBinding要素を追加します.
  • XMLファイルでは、<layout>タグ内にXMLレイアウトを作成する必要があります.
  • <layout :android="http://schemas.android.com/apk/res/android"
       ...>
            <androidx.drawerlayout.widget.DrawerLayout
            ...
                android:id="@+id/drawer">
    
                <TextView
                    android:id="@+id/primary_tv"
                    ...
                    android:text="PRIMARY CONTENTS"/>
                    ...
            </androidx.drawerlayout.widget.DrawerLayout>
    </layout>
    
  • アクティビティでは、DataBindingUtilは既存のsetConnetView()関数を使用します.setContentView()に置き換えます.
  • ビューに表示されるデータクラスを宣言します.
    ビューにデータオブジェクトをバインドするために、Data 11というデータクラスが作成されました.
  • data class Data11(
    
        val data1 : String = "",
        val binding1 : String = ""
    )
  • レイアウトでは、<data>ラベルに<variable>ラベルを追加します.これは、データとビューを接続するタグです.
  • name->名前、
  • type->パス
  • 接続するデータを含む
    <layout :android="http://schemas.android.com/apk/res/android"
        ...>
    
        <data>
            <variable
                name="data11"
                type="com.example.drawerlayout.Data11" />
        </data>
    
            <androidx.drawerlayout.widget.DrawerLayout
                ...>
    
                <TextView
                    ...
                    android:text="@{data11.data1}"
                   	/>
    
                <TextView
                    android:text="@{data11.binding1}"
                    />
            </androidx.drawerlayout.widget.DrawerLayout>
    
    </layout>
    上のように<data>のラベルを追加し、下に私たちが使っているレイアウトを追加すればいいです.
    上記のソースについては、データクラス「data 11」のデータに「data 11」でアクセスできます.変数を使用する場合は、@{'XML宣言の名前'.activity宣言のデータラベル'}を入力します.
    実はよくViewModelやLiveDataと一緒に使っています
    @{}構文には簡単な式も含まれます.
  • Activityでは、先に定義したXMLの<data><variable>のnameをバインドすることにより、データクラスData 11のデータが取得される.(Activityでdata 11オブジェクトを初期化します.)
  • class MainActivity : AppCompatActivity() {
        private lateinit var binding : ActivityMainBinding
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
            binding.data11 = Data11("data", "binding")
            // data11은 activity_main.XML에서 선언한 <data>의 <variable> 의 name
        }
    }

    ActivityでDataBindingを使用してDataClassのデータを変更し、XMLを一度に変更できるようになりました.

    DataBindingを使用する理由


  • xmlにデータをバインドして、不要なコードを減らすことができます.(通常MVVMモードの実装に用いられる
    例ではTextViewのtextは2つしかバインドされていませんが、実際に使用する場合、DTOまたはデータクラスで接続されているクラスの変更により、多くの接続のビューが同時に変更されるため、非常に便利です.
    また、BindingAdapter(DataBindingなど)やBindingAdapter(ImageViewでイメージ・ロード・ライブラリを使用)を使用すると、イメージを簡単に出力できます.LiveDataを使用すると、データがリアルタイムで変更されると、MVVMモードを実現するためにビューが変更されます.

  • Databindingを使用すると、findViewById()を使用することなく、xmlで作成したビューを自動的に作成できます.

  • データが変更された場合は、自分で変更したデータを使用してビューを変更できます.(傍観者を使用する場合)

  • RecyclerViewで各項目に設定した操作もXMLで書き終わると自動的に値が入力されます.

  • GoogleはDataBindingを使用することをお勧めします.
  • DataBinding Vs ViewBinding



    DataBindingはViewBindingとしても機能します.また、動的UIコンテンツ宣言、双方向データバインディングもサポートされています.
    ViewBindingは、DataBindingに比べてパフォーマンス効率が向上し、容量が低下します.
    findViewByIdを置き換えるためだけにBindingを書く場合は、ViewBindingを使用することをお勧めします.
    ソース:
    https://tourspace.tistory.com/314
    https://todaycode.tistory.com/29
    https://developer.android.com/topic/libraries/view-binding?hl=ko#fragments
    https://velog.io/@jojo_devstory/Android-Databinding%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90