Android Binding (ViewBinding, DataBinding)
23723 ワード
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システムが出現したが,まだ安定していないため廃棄された.
を選択します.
val textview = findViewById<TextView>(R.id.example_tv)
textview.text = "바꾼 텍스트"
ViewBindingの使用
build.勾配を追加
android {
...
buildFeatures {
viewBinding = true
}
}
android {
...
viewBinding{
enabled true
}
}
ViewBindingオプションを有効にすると、プロジェクト内のレイアウトファイルにBindingクラスが生成され、各ファイルに宣言されたビューのid参照がクラスに含まれます.アクティビティでのViewBindingの使用
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つの静的関数があります.
View Binding完了
(ViewBindingは、DataBindingを使用しない単純な使用要求によって開発されています.)
DataBinding
バインディングDataBinding:データのグループ化(連結)
これは、プログラムで接続するのではなく、ユーザーインタフェース要素とデータを宣言形式で結合するのに役立つライブラリです.
プログラム性と宣言性
レイアウトは、通常、ビュー付きXMLファイルに関連付けられたアクティビティで定義されます.たとえば、次のコードはfindViewById()を呼び出してTextViewコンポーネントを検索し、viewModel変数のuserNameプロパティにバインドします.
コードに値を入力して
// findViewById 방식
val textview = findViewById<TextView>(R.id.textview11)
textview.text = "안녕"
// ViewBinding 방식
binding.textview11.text = "안녕"
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{viewmodel.userName}" />
宣言方法->アクティビティは論理保持コードのみであり、ビューに関連するアクションはレイアウトファイルで定義されます.すなわち,レイアウトにおいて接続データとビューの操作を処理する技術をdatabindingと呼ぶ.
DataBindingの使用
build.勾配を追加
// Android Studio 4.0 이상
adroid{
...
buildFeatures {
dataBidning = true
}
}
// Android Studio 3.6 ~ 4.0
adroid{
...
dataBinding {
enabled true
}
}
ActivityでのDataBindingの使用
アクティビティでDataBindingを使用します.
<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>
ビューにデータオブジェクトをバインドするために、Data 11というデータクラスが作成されました.
data class Data11(
val data1 : String = "",
val binding1 : String = ""
)
<data>
ラベルに<variable>
ラベルを追加します.これは、データとビューを接続するタグです.<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と一緒に使っています
@{}構文には簡単な式も含まれます.
<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
Reference
この問題について(Android Binding (ViewBinding, DataBinding)), 我々は、より多くの情報をここで見つけました https://velog.io/@sh1mj1/Android-Binding-ViewBinding-DataBindingテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol