新しいViewBindingは、Kotlin Android Extensionsと合成ビューバインディングをどのように比較しますか?
新しいViewBindingsによって提供されるNullSafetyとTypeSafetyを別にして、ビューで合成バインディングを使用するKotlinの方法を廃止することを検討する必要があるのはなぜですか。
新しいViewBindingは、事前にBindingクラスを生成するため、パフォーマンスが向上していますか?
新しいViewBindingは、Kotlin Android Extensionsと合成ビューバインディングをどのように比較しますか?
新しいViewBindingsによって提供されるNullSafetyとTypeSafetyを別にして、ビューで合成バインディングを使用するKotlinの方法を廃止することを検討する必要があるのはなぜですか。
新しいViewBindingは、事前にBindingクラスを生成するため、パフォーマンスが向上していますか?
回答:
2つを確認してみましょう。
import kotlinx.android.synthetic.main.<layout>.*
textView.text = "Hello, world!"
。これらの拡張機能はActivities
、Fragments
とで機能しViews
ます。private lateinit var binding
YourClassBinding
binding = YourClassBinding.inflate(layoutInflater)
内部Activity
のonCreate
通話をsetContentView(binding.root)
、またはそれを膨らませるFragment
のonCreateView
にそれを返し、その後:return binding.root
binding.textView.text = "Hello, world!"
参照ビューは既に適切なタイプにキャストされているため、Kotlin Android ExtensionsとViewBindingは定義によりタイプセーフです。
Kotlin Android ExtensionsとViewBindingはどちらもnullセーフです。ここではViewBindingに利点はありません。KAEの場合、一部のレイアウト構成でのみビューが存在する場合、IDEはそれを指摘します。
したがって、それをKotlin内の他のnull許容型として扱うだけで、エラーが消えます。
Kotlin Android拡張機能の場合、レイアウトの変更は即座に合成拡張機能の生成に変換されるため、すぐに使用できます。ViewBindingの場合、プロジェクトをビルドする必要があります
Kotlin Android拡張機能の場合、誤ったレイアウトの合成拡張機能をインポートして、を引き起こす可能性がありNullPointerException
ます。間違ったクラスをインポートする可能性があるため、同じことがViewBindingにも当てはまりますBinding
。ただし、特にレイアウトファイルの名前がActivity
/ Fragment
/ View
にちなんでいる場合は、誤ったクラス名よりも誤ったインポートを見落とす可能性が高いため、ここではViewBindingが有利です。
Kotlin Android Extensionsプラグインを使用すると、追加のコードを追加しなくても、これらのライブラリのいくつかと同じエクスペリエンスを取得できます。
ViewBindingがKAEの代わりになるという大きな誤解があると思います。人々は大きなキーワードを聞いて、事前に確認することなくそれらを繰り返します。確かに、ViewBindingは現在のJava開発に最適なオプションです(ButterKnifeの置き換え)。ただし、KotlinのKAEに勝る利点はほとんどありません(不適切なレイアウトの使用法のセクションを参照)。
補足: DataBindingの人はViewBindingを気に入るはずです:)
DataBinding
ですか?ビュー参照を一切使わないことが重要な機能だと思います。ちなみに、<include ... />
タグを使用してビューモデルを「スロー」できるという点も、大きな利点です。
ViewBinding
の最大の問題を解決しましたkotlinx.android.synthetic
。ではsynthetic
、あなたがレイアウトにあなたのコンテンツビューを設定した場合、その後、唯一異なるレイアウトに存在するIDを入力結合、IDEを使用すると、オートコンプリート、新たなインポート文を追加することができます。開発者がimportステートメントが正しいビューのみをインポートすることを確認するために特に確認しない限り、これがランタイムの問題を引き起こさないことを確認する安全な方法はありません。しかし、中にViewBinding
あなたが使用する必要がありますlayout
異なるレイアウトで表示するために呼び出すあなたように、その見解を決してアクセスしないように結合オブジェクトを、あなたはこれをしたい場合は、コンパイルエラーではないランタイムエラーを取得します。ここに例があります。
私たちは、と呼ばれる2つのレイアウトを作成activity_main
し、activity_other
そのように:
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/message_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
activity_other.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:id="@+id/message_other"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
次のようにアクティビティを記述したとします。
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_other.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//Application will crash because "message_other" doesn't exist in "activity_main"
message_other.text = "Hello!"
}
}
コードはエラーなしでコンパイルされますが、アプリケーションは実行時にクラッシュします。message_other
IDを持つビューがに存在activity_main
せず、コンパイラがこれをチェックしなかったためです。しかし、次のViewBinding
ように使用した場合:
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
//This code will never compile and the IDE shows you an error
binding.message_other.text = "Hello!"
}
}
コードはコンパイルされずAndroid Studio
、最終行にエラーが表示されます。
kotlinx.android.syntheticは、推奨されなくなったプラクティスであり、Googleが1つのコミットメッセージ「Redditスレッドの1つ
https://android-review.googlesource.com/c/platform/frameworks/support/+/882241 "
Syntheticsはgoogleによって開発されたものではなく、JetBrainsによって作成されたkotlin android拡張機能の一部であり、徐々にgoogle android開発者はデモとソースコードでSyntheticsをViewBindinsに置き換え始めました。
「さて、問題を考えましょう。どちらを考慮に入れなければなりませんか。」
グーグル(ビューバインディング、バターナイフ、コトリン合成)によると、これらのライブラリは多くのアプリで正常に使用され、同じ問題を解決しています。
ただし、ほとんどのアプリでは、これらのライブラリではなくビューバインディングを試すことをお勧めします。ビューバインディングは、より安全で簡潔なビュールックアップを提供するためです。
ただし、詳細を知りたい場合は、以下のリンクをクリックしてください。 https://medium.com/androiddevelopers/use-view-binding-to-replace-findviewbyid-c83942471fc
or after view lifecycle ends
一部スキップしましたか?
apply plugin: 'kotlin-android-extensions'
vs についての議論viewBinding { enabled = true }
です。大した違いはありません。