2016-04-18 13 views
3

こんにちは、私はAndroid/Kotlin/Ankoを新しくしています。Anko内の色のリソースにアクセスする方法に関する質問があります。Kotlin&Ankoを使用してリソースIDにアクセスする

私は、あなたは、単にリソース文字列を設定する処理を簡素化するR.string.my_colorが、どのようViewクラスからResourcesインスタンスを使用して色をアクセスについてを渡すtextResourceのようなヘルパーがあることを知っていますか?

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

Resourcesに拡張機能を作成していますか?

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

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

EDIT

私はこれは本当にアンドロイド優しい

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)) 
+0

代わりに 'resources.getColor(v、null)'の代わりに 'ContextCompat.getColor(context、R.color.color_id)'を使うことをお勧めします。 –

答えて

2

であれば、私は見当がつかない除いて、私は行うにはきれいなものを見つけた、まさにそれを行うにはtextColor値の拡張子を変更しましたあなたが提案したものの代わりに、このようなプロパティ拡張を使用することができると思います。

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

それともダミアンPetlaにより示唆されるようContextCompatを使用します。

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

あなたは維持する必要がありアンコのtextColor

  • は、いくつかの点で必要な場合は、XMLからそれを取ることなく、直接色を設定することができます
  • あなたが間違ったtextColor(Ankoのものかあなたのもの)をインポートしないようにします。違う振る舞いの同じプロパティ名はお勧めできません。
関連する問題