私はkotlinが初めてです。私が発見し、代わりに迷惑な方法の合成方法を使用しようとしましたfindViewById
、私の中でActivity
クラスが、我々は(アダプタクラスで有用)ビューの合成のプロパティを呼び出したい場合は、私が」発見した、我々はまた、kotlinx.android.synthetic.mainインポートする必要があります。見る。*。" しかし、私はそれが正確にどのように機能するのか理解できませんか?例はありますか?
回答:
https://github.com/antoniolg/Kotlin-for-Android-Developersの簡単な例
import kotlinx.android.synthetic.item_forecast.view.*
class ForecastListAdapter() : RecyclerView.Adapter<ForecastListAdapter.ViewHolder>() {
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bindForecast(forecast: Forecast) {
itemView.date.text = forecast.date.toDateString()
}
}
}
書く必要はありません
val view = itemView.findViewById(R.id.date) as TextView
view.text = forecast.date.toDateString()
ただ
itemView.date.text = forecast.date.toDateString()
シンプルで効果的!
コトリング1.1.4アウト
詳細情報:https://antonioleiva.com/kotlin-android-extensions/
これをbuild.gradleに追加して、Kotlin AndroidExtentionsを有効にする必要があります。
apply plugin: 'org.jetbrains.kotlin.android.extensions'
androidExtensions {
experimental = true
}
Kotlinのこの新しいバージョン以降、Android拡張機能にはいくつかの新しい興味深い機能が組み込まれています。任意のクラスのキャッシュ(興味深いことにViewHolderが含まれています)
ViewHolder(または任意のカスタムクラス)で使用します。このクラスはLayoutContainer
インターフェースを実装する必要があることに注意してください。
class ViewHolder(override val containerView: View) : RecyclerView.ViewHolder(containerView),
LayoutContainer {
fun bind(title: String) {
itemTitle.text = "Hello Kotlin!"
}
}
1.3.21
です。彼らはそれを実装するつもりはないと思います
containerView.itemTitle.text = "Hello Kotlin!"
、
あなたが必要
import kotlinx.android.synthetic.row_wall.view.*
そして後で次の線に沿った何か:
convertView.titleText.text = item.title
重要なのは、view。*がViewクラスに拡張機能を導入することです。
試してみてください
class CustomViewModel(val baseView: View) {
val firstName = baseView.firstName
val lastName = baseView.lastName
}
ビューオブジェクトはビューを公開しますref:https://discuss.kotlinlang.org/t/unable-to-use-kotlin-android-extension-in-adapter-class/2890
最新バージョンl;を使用している場合は、experimental = trueを追加する必要はありません。
プロジェクトレベルのGradleで
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.21'
そしてアプリレベルのGradle
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions' //These should be on the top of file.
と依存関係で。
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.21'
以下のようにインポートします
import kotlinx.android.synthetic.main.your_layout_file_name.view.*
と例
import kotlinx.android.synthetic.main.item_animal.view.*
class AnimalVH(parent: ViewGroup, layoutID: Int) : BaseViewHolder<Animal>(parent, layoutID) {
override fun bindData(animal: Animal) {
itemView.tv_animal.text = animal.title
}
}
BaseViewHolderは
abstract class BaseViewHolder<T>(parent: ViewGroup, layoutID: Int) : RecyclerView.ViewHolder(
LayoutInflater.from(parent.context).inflate(layoutID, parent, false)
) {
abstract fun bindData(model: T)
}
.view.*
インポートを使用すると目的が損なわれると思います。フォールバックはfindViewById<>
、毎回、パターンViewHolder
そのものを思いとどまらせることです。
これは、ソースファイルの先頭に次の行を配置する必要があることを意味します。
import kotlinx.android.synthetic.main.view.*
だから今、例えばの代わりに、findView(R.id.textView) as TextView
あなたはただ書くでしょうtextView
ます。後者は、パッケージに含まれる合成拡張プロパティです。kotlinx.android.synthetic.main.view
にそこからすべてをインポートする必要があります。
公式サイトにチュートリアルがありますので、ご覧ください。
findViewById()
にはView
、のように、でメソッドを呼び出すことができますholder.findViewById(R.id.name)
。Kotlin Android Extensionsを使用すると、ただ書くことができますholder.name
。このコードは内部で書かれているとgetView()
機能:val base = inflater.inflate(R.layout.list_item, parent, false)
base.name.text = "John Smith"
ご参考までに:ビュールックアップには、合成よりもデータバインディングをお勧めします。
Reddit上のGoogleのAndroid用DAからのコメント
ねえ!ここGoogleでAndroidの開発者擁護者!
ここに少し背景を追加したいと思いました。合成ビューを備えたKotlin拡張機能は、意図的に「推奨」されることはありませんでしたが、使用しないことを推奨するものではありません。彼らがあなたのために働いているなら、あなたのアプリでそれらを使い続けてください!
無効なルックアップに対するチェックなしで実際に拡張されたレイアウトとは関係のないIDのグローバル名前空間を公開し、Kotlinのみであり、ビューが一部の構成にのみ存在する場合は、null可能性を公開しません。これらの問題により、APIはAndroidアプリのクラッシュ数を増加させます。
一方、ビューのルックアップを簡素化するのに役立つ軽量のAPIを提供します。このスペースでは、自動ビュールックアップも実行するデータバインディングを確認する価値があります。また、LiveDataと統合して、データの変更に応じてビューを自動的に更新します。
今日、このスペースで機能するいくつかのオプションがあります。
データバインディングは、ビュールックアップとバインディングの推奨事項ですが、Android Kotlin Extensionsと比較すると、多少のオーバーヘッドが追加されます。これがアプリに適しているかどうかを確認する価値があります。データバインディングを使用すると、LiveDataを監視して、データが変更されたときにビューを自動的にバインドすることもできます。Kotlin Extensionsと比較して、ビュールックアップとタイプセーフティのコンパイル時チェックが追加されています。Android Kotlin Extensionsは公式には推奨されていません(これは推奨と同じではありません)。上記の問題が発生するため、コードでは使用していません。バターナイフは非常に人気のある別のソリューションであり、KotlinとJavaプログラミング言語の両方で機能します。ここのコメントを読んでください KotlinExtensionsで幸運を祈っている多くの開発者。これはすばらしいことです。APIを継続的に改善する方法を検討する際に留意する必要があります。データバインディングをまだ見ていない場合は、ぜひ試してみてください。
余談ですが、内部コードスタイルガイドは、コードベースの外部に直接適用することを意図したものではありません。たとえば、mPrefixVariablesを使用しますが、すべてのアプリがそのスタイルに従う必要がある理由はありません。