3

私は Android/Kotlin/Anko が初めてで、Anko 内から色 (およびおそらく他の) リソースにアクセスする方法について質問があります。

リソース文字列を設定するプロセスを簡素化するために をtextResource渡すだけのようなヘルパーがあることは知っていますが、クラスのインスタンスを使用して色にアクセスするのはどうですか?R.string.my_colorResourcesView

Buttonのサブクラスがあり、テキストの色を変更したいとしましょう。を使用するtextResourceと、色ではなくテキスト文字列が変更されます。使用する場合textColorは、実際のリソース ID を使用して指定する必要があります。resources.getColor(R.color.my_color, null)これは、オプションのテーマ パラメーターを渡す必要がなければそれほど面倒ではありません (nullこちら)。

ここで拡張機能を作成するとResources便利ですか?

fun Int.fromResources(resources: Resources): Int {
    return resources.getColor(this, null)
}

推奨される方法は何ですか?

編集

私はそれを行うように値の拡張機能を変更しました。これが本当にAndroidに適しtextColorているかどうかわからないことを除けば、これが最もクリーンな方法でした。

var android.widget.TextView.textColor: Int
    get() = throw AnkoException("'android.widget.TextView.textColor' property does not have a getter")
    set(v) = setTextColor(resources.getColor(v, null))
4

1 に答える 1

2

あなたが提案したものの代わりに、このようなプロパティ拡張を使用できると思います:

var TextView.textColorRes: Int
    get() = throw PropertyWithoutGetterException("textColorRes")
    set(@ColorRes v) = setTextColor(resources.getColor(v, null))

またはContextCompat、Damian Petla の提案に従って使用します。

var TextView.textColorRes: Int
    get() = throw PropertyWithoutGetterException("textColorRes")
    set(@ColorRes v) = setTextColor(ContextCompat.getColor(context, v))

Anko を保持する必要がありますtextColor

  • 必要に応じて、XML から取得せずに色を直接設定できます。
  • 間違ったもの (Anko のものまたはあなたのもの) をインポートするのを防ぎますtextColor。動作が異なる同じプロパティ名は良い考えではありません。
于 2016-05-05T15:13:22.230 に答える