Yanıtlar:
Kullanabilirsiniz:
getResources().getColor(R.color.idname);
Özel renklerin nasıl tanımlanacağı hakkında buraya bakın:
http://sree.cc/google/android/defining-custom-colors-using-xml-in-android
DÜZENLEME (1):
yana getColor(int id)
olan kullanımdan kaldırıldı şimdi, bu kullanılmalıdır:
ContextCompat.getColor(context, R.color.your_color);
(destek kitaplığına 23 eklendi)
DÜZENLEME (2):
Aşağıdaki kod, Marshmallow öncesi ve sonrası için kullanılabilir (API 23)
ResourcesCompat.getColor(getResources(), R.color.your_color, null); //without theme
ResourcesCompat.getColor(getResources(), R.color.your_color, your_theme); //with theme
android.R.color.some_color
da çok işe yarıyor örneğin: getResources().getColor(android.R.color.holo_blue_bright)
(en azından API 17'de)
ContextCompat
ve ResourcesCompat
? Pratik bir fark yoksa, bunlardan birini cevabınızdan çıkarmanız daha az kafa karıştırıcı olacaktır.
Yeni Android Destek Kitaplığı'na (ve bu güncellemeye) dayanarak , şimdi aramalısınız:
ContextCompat.getColor(context, R.color.name.color);
Belgelere göre :
public int getColor (int id)
Bu yöntem API 23 düzeyinde kullanımdan kaldırıldı . Bunun yerine getColor (int, Tema) kullanın
Aynı çözüm getResources().getColorStateList(id)
:
Bunu şu şekilde değiştirmeniz gerekir:
ContextCompat.getColorStateList(getContext(),id);
2019 DÜZENLE
İle ilgili olarak ThemeOverlay
en yakın görüş bağlamında kullanımı:
val color = ContextCompat.getColor(
closestView.context,
R.color.name.color
)
Böylece ThemeOverlay'inize göre doğru rengi elde edersiniz.
Aynı aktivitede koyu / açık tema gibi farklı temalar kullandığınızda özellikle gereklidir. Temalar ve Stiller hakkında daha fazla bilgi edinmek isterseniz bu konuşma önerilir: Temaları Stille Geliştirme
Theme
null olarak geçirilebilir, bu yüzden getColor(R.color.my_color, null)
hangi temanın geçeceğinden emin değilseniz arayın .
değerler / color.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- color int as #AARRGGBB (alpha, red, green, blue) -->
<color name="orange">#fff3632b</color>
...
<color name="my_view_color">@color/orange</color>
</resources>
int backgroundColor = ContextCompat.getColor(context, R.color.my_view_color);
// Color backgroundColor = ... (Don't do this. The color is just an int.)
myView.setBackgroundColor(backgroundColor);
getResources()
bir Activity
ya da kullanabilirsiniz Fragment
?
getResources()
.
getResources()
aynı zamanda Bağlam uygulayan her şeyde ve ayrıca Görünümlerde herkese açık bir API olarak kullanılabilir.
@Sat cevabı olarak, renk elde etmek için iyi bir yaklaşım
ResourcesCompat.getColor(getResources(), R.color.your_color, null);
veya getResources()
yönteme erişiminiz olmadığında aşağıdaki yolu kullanın .
Context context = getContext(); // like Dialog class
ResourcesCompat.getColor(context.getResources(), R.color.your_color, null);
public void someMethod(){
...
ResourcesCompat.getColor(App.getRes(), R.color.your_color, null);
}
Uygulamanızda herhangi bir yerde kullanmak en basit! Util sınıfında veya Context veya getResource () özelliği olmayan herhangi bir sınıfta bile
Ne zaman sende olmayan Context
erişimi sizin de bir yöntem gibi, Util
sınıfın.
Aşağıdaki yöntemi Bağlam olmadan varsayalım.
public void someMethod(){
...
// can't use getResource() without Context.
}
Şimdi Context
bu yöntemde bir parametre olarak geçeceksiniz vegetResources().
public void someMethod(Context context){
...
context.getResources...
}
İşte size kaynaklara herhangi bir yerden erişebileceğiniz benzersiz bir Bonus çözümüUtil class
. Ekle Resources
sizin için Application
sınıf veya mevcut değilse bir tane oluşturun.
import android.app.Application;
import android.content.res.Resources;
public class App extends Application {
private static App mInstance;
private static Resources res;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
res = getResources();
}
public static App getInstance() {
return mInstance;
}
public static Resources getResourses() {
return res;
}
}
manifest.xml
<application
Etiketinize ad alanı ekleyin . (Henüz eklenmediyse)
<application
android:name=".App"
...
>
...
</application>
Şimdi gitmekte fayda var. ResourcesCompat.getColor(App.getRes(), R.color.your_color, null);
Uygulamada herhangi bir yerde kullanın .
Kullanmak için güncelledim ContextCompat.getColor(context, R.color.your_color);
ama bazen (bazı cihazlarda / Android sürümlerinde. Emin değilim) NullPointerExcepiton'a neden oluyor.
Bu yüzden, tüm cihazlarda / sürümlerde çalışmasını sağlamak için, boş bir işaretçi durumunda, eski yöntemine geri dönüyorum.
try {
textView.setTextColor(ContextCompat.getColor(getActivity(), R.color.text_grey_dark));
}
catch(NullPointerException e) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
textView.setTextColor(getContext().getColor(R.color.text_grey_dark));
}
else {
textView.setTextColor(getResources().getColor(R.color.text_grey_dark));
}
}
Resources.getColor(int, Theme)
kullanın? Çalışma zamanı istisnalarını yakalamamalısınız.
Bu soruyu arama sonuçlarında ortaya çıkarmaya yardımcı olabilecek başka bir kullanım durumu hakkında daha fazla bilgi için, kaynaklarımda tanımlanan bir renge alfa uygulamak istedim.
@ Sat'ın doğru cevabını kullanarak:
int alpha = ... // 0-255, calculated based on some business logic
int actionBarBackground = getResources().getColor(R.color.actionBarBackground);
int actionBarBackgroundWithAlpha = Color.argb(
alpha,
Color.red(actionbarBackground),
Color.green(actionbarBackground),
Color.blue(actionbarBackground)
);
İşe yarayan daha kolay bir yol buldum:
Color.parseColor(getString(R.color.idname);
Etkinlik olmayan bir sınıftan renklere erişmek zor olabilir. Bulduğum alternatiflerden biri de kullanmaktı enum
. enum
çok fazla esneklik sunar.
public enum Colors
{
COLOR0(0x26, 0x32, 0x38), // R, G, B
COLOR1(0xD8, 0x1B, 0x60),
COLOR2(0xFF, 0xFF, 0x72),
COLOR3(0x64, 0xDD, 0x17);
private final int R;
private final int G;
private final int B;
Colors(final int R, final int G, final int B)
{
this.R = R;
this.G = G;
this.B = B;
}
public int getColor()
{
return (R & 0xff) << 16 | (G & 0xff) << 8 | (B & 0xff);
}
public int getR()
{
return R;
}
public int getG()
{
return G;
}
public int getB()
{
return B;
}
}
En Son Çalışma Yöntemi:
getColor(R.color.snackBarAction)
Mevcut min. API düzeyi 23'tür, aşağıdakiler için kullandığımız getColor()
gibi kullanabilirsiniz getString()
:
//example
textView.setTextColor(getColor(R.color.green));
// if context is not available(ex: not in activity) use with context.getColor()
API seviyesinin altında istiyorsanız 23
, şunu kullanın:
textView.setTextColor(getResources().getColor(R.color.green));
Ancak getResources().getColor()
API Düzeyi'nde kullanımdan kaldırıldığını unutmayın 23
. Bu durumda, yukarıdaki ile değiştirin:
textView.setTextColor(ContextCompat.getColor(this /*context*/, R.color.green)) //Im in an activity, so I can use `this`
ContextCompat : içindeki özelliklere erişmek için yardımcıContext
İsterseniz, SDK_INT
aşağıdaki gibi kısıtlama yapabilirsiniz :
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
textView.setTextColor(getColor(R.color.green));
} else {
textView.setTextColor(getResources().getColor(R.color.green));
}
ContextCompat.getColor(context, R.color.your_color);
faaliyette
ContextCompat.getColor(actvityname.this, R.color.your_color);
parça halinde
ContextCompat.getColor(getActivity(), R.color.your_color);
Örneğin:
tvsun.settextcolour(ContextCompat.getColor(getActivity(), R.color.your_color))