Kotlinのカスタム属性データバインディング
2023-11-13 15:30:24
質問
カスタム属性を設定するために Androidデータバインディングライブラリ を使ってカスタム属性を設定しようとしています。
レイアウト
<ImageView
android:id="@+id/imgView”
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center"
android:adjustViewBounds="true"
app:imageUrl="@{segment.url}"/>
コード
class Utils {
companion object {
@BindingAdapter("bind:imageUrl")
@JvmStatic
fun loadImage(view: ImageView, url:String)
{Picasso.with(view.context).load(url).error(R.drawable.error).into(view)}
}
}
表示される実行時エラーは
<package.Utils.Companion> にあるBindingAdapterは静的ではなく、DataBindingComponentから取得した、使用するオブジェクトを必要とします。DataBindingComponentを取るインフレーションメソッドを使用しない場合は、DataBindingUtil.setDefaultComponentを使用するか、すべてのBindingAdapterメソッドをstaticにします。
解決するためのポインタがあれば教えてください。
これはカスタム属性にのみ発生します。残りのデータバインディングは問題なく動作します。
どのように解決するのですか?
トップレベルの関数を保持するだけで、クラスやコンパニオンオブジェクトは必要ありません。
FileNameKt
で上書きされない限り
@file:JvmName
アノテーション
@BindingAdapter("imageUrl")
fun loadImage(view: ImageView, url:String) { ... }
もう一つの方法として、Extension Functionにアノテーションを付ける方法があります。
@BindingAdapter
バイトコードではシグネチャがDataBindingsが期待するシグネチャと正確に一致するのでうまくいきますが(生成されたメソッドは最初の引数として拡張クラスのオブジェクトを受け取ります)、関数もトップレベルのままであるべきです。
@BindingAdapter("imageUrl")
fun ImageView.loadImage(url:String) { ... }
もう一つの選択肢は
BindingAdapter
を拡張プロパティと組み合わせることです。
@set:BindingAdapter("visible")
var View.visible
get() = visibility == VISIBLE
set(value) {
visibility = if (value) VISIBLE else GONE
}
関連
-
[解決済み] Kotlin 三項条件演算子
-
[解決済み] KotlinのソースファイルからJavaのソースファイルへの変換方法
-
[解決済み] Kotlinのvarとvalの違いは何ですか?
-
[解決済み】KotlinでJavaの静的メソッドに相当するものは何ですか?
-
[解決済み】Kotlinで配列を値で初期化する方法は?
-
[解決済み】Kotlinの文字列テンプレートでのフォーマット
-
[解決済み] Kotlin データクラスのオーバーライドゲッター
-
[解決済み] Kotlinで抽象クラスのインスタンスを生成する
-
[解決済み] 実験的な "Kotlinコルーチン "は実運用に使えるか?
-
[解決済み] Kotlinでオブジェクトをクローンする方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Kotlinにコンストラクタ参照はありますか?
-
[解決済み] KotlinでNullチェックを行う最良の方法とは?
-
[解決済み] Kotlin: withContext() vs Async-await
-
[解決済み] kotlin.jvm.KotlinReflectionNotSupportedError.KotlinReflectionNotSupportedError.KotlinReflectionNotSupportedError: ランタイムにKotlin Reflectionの実装が見つかりませんでした。kotlin-reflect.jar があることを確認してください。
-
[解決済み] Kotlinにおけるスレッドとコルーチンの違い
-
[解決済み] kotlinのinitブロックとコンストラクタの違いは何ですか?
-
[解決済み] KotlinはJava Lombokのアクセサーを見ない?
-
Kotlin 適用 vs 使用
-
Kotlinのcrossinlineとnoinlineの違いは何ですか?
-
KotlinのSwap関数