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.gradleplugins {
id 'kotlin-android-extensions'
}
Activityimport kotlinx.android.synthetic.main.activity_main.*
...
textView1.text = "this is TextView"
しかし、以下の欠点から、コートリンバージョン1.4.20はサポートを停止し始めた.
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'
}
Activityimport kotlinx.android.synthetic.main.activity_main.*
...
textView1.text = "this is TextView"
しかし、以下の欠点から、コートリンバージョン1.4.20はサポートを停止し始めた.グーグルもこの2つの方法で開発することを提案している.
それぞれの特徴を理解してください.
2.View Bindingによる制御
View BindingはAndroid Studio 3.6から提供されています
build.gradleandroid {
...
// 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.gradleandroid {
...
// 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>
ViewModelclass MainViewModel : ViewModel() {
private val _text1 = MutableLiveData<String>()
val text1 : MutableLiveData<String> = _text1
...
fun onSaveClick(){
...
}
}
分割セクションを作成し、ViewModelをbindingオブジェクトに接続します.これによりMVVM構造を作成できます.
接続後、XMLではViewModelの変数とメソッドを自由に使用できます.また、lifecycleOwnerを対応するパーティションに登録して、ViewModelのデータが変更されたときにビューを更新することもできます.
Fragmentprivate 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モードを構築する際に有効です.
Reference
この問題について(View BindingとData Binding), 我々は、より多くの情報をここで見つけました
https://velog.io/@ccs6473/View-Binding-과-Data-Binding
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
android {
...
// Binding 설정
buildFeatures{
viewBinding = true
}
}
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
}
}
}
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>
ViewModelclass 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モードを構築する際に有効です.
Reference
この問題について(View BindingとData Binding), 我々は、より多くの情報をここで見つけました https://velog.io/@ccs6473/View-Binding-과-Data-Bindingテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol