Renk kaynağından color-int alın


448

Renk kaynağından renk int almanın bir yolu var mı? Üç seekbar değerleri belirli bir seviyeye ayarlayabilirsiniz böylece kaynak (R.color.myColor) tanımlanan bir rengin bireysel kırmızı, mavi ve yeşil bileşenleri almaya çalışıyorum.

Yanıtlar:


928

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

7
android.R.color.some_color hakkında ne dersiniz :-(
Blundell

17
@Blundell uhh, şimdi ihtiyacınız varsa dunno ama bu android.R.color.some_colorda çok işe yarıyor örneğin: getResources().getColor(android.R.color.holo_blue_bright)(en azından API 17'de)
ataulm

30
getColor () artık kullanımdan kaldırılmıştır, şunları kullanabilirsiniz: ContextCompat.getColor (context, R.color.your_color);
Ricardo

2
Sana düzenlemeleri yaptıktan biri değildir farkındayım ama arasındaki fark nedir ContextCompatve ResourcesCompat? Pratik bir fark yoksa, bunlardan birini cevabınızdan çıkarmanız daha az kafa karıştırıcı olacaktır.
16'da Suragch

14
Google neden bu korkunç uygulama kompakt kitaplığı için mükemmel derecede iyi bir işlevi kullanma gereğini duymaz. Berbat, ikisine de sahip.
Andrew S

116

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 ThemeOverlayen 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

Nick Butcher - Droidcon Berlin - Stil ile Tema Geliştirme


10
Yeni yöntemde tema olarak neyi dolduracağını merak edenler için Themenull olarak geçirilebilir, bu yüzden getColor(R.color.my_color, null)hangi temanın geçeceğinden emin değilseniz arayın .
w3bshark

hmm ... herkesin söylediği bu ama işe yarayamıyorum. Bağlamı başlatmam gerekiyor mu? Şu anda "'bağlam' sembolü çözülemiyor"
alıyorum

Doğru yaptığınızdan emin olmak için, içeriğin onCreate içinde çağırmayı deneyin, bağlam almak için getContext () veya yalnızca "this" olarak adlandırmanız gerekir
Ultimo_m

35

Renginizi tanımlayı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>

İnt rengini alın ve ayarlayın

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);

Ayrıca bakınız


1
sadece getResources()bir Activityya da kullanabilirsiniz Fragment?
Zapnologica

2
@Zapnologica, bir Aktivite veya Parçanın dışında kullanma hakkındaki düşünceler için bu sorunun cevaplarına bakın getResources().
Suragch

1
@Zapnologica no. getResources()aynı zamanda Bağlam uygulayan her şeyde ve ayrıca Görünümlerde herkese açık bir API olarak kullanılabilir.
ataulm

7

En İyi Yaklaşım

@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);

Yaptığım şey

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

Sorun (Bağlamınız olmadığında)

Ne zaman sende olmayan Contexterişimi sizin de bir yöntem gibi, Utilsınıfın.

Aşağıdaki yöntemi Bağlam olmadan varsayalım.

public void someMethod(){
    ...
    // can't use getResource() without Context.
}

Şimdi Contextbu 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 Resourcessizin için Applicationsı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 <applicationEtiketinize 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 .


5

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));
    }
}

neden her durumda eski sürümü kullanmıyorsunuz veya sürümü yine de kontrol ediyorsanız, mümkünse yeni API'yı Resources.getColor(int, Theme)kullanın? Çalışma zamanı istisnalarını yakalamamalısınız.
ataulm

Sanırım sadece OKB. ContextCompat, bana göre bunu yapmanın gelecekteki kanıt yolu ve dolayısıyla doğru yol gibi görünüyor. Benim yaklaşımım, doğru şekilde yapmak. Ve bu başarısız olursa (eski cihazlarda veya herhangi bir şekilde), eski şekilde yapın. Çalışma zamanında neden istisnaları yakalamamalıyım?
ninjachippie

1

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)
);

1

İşe yarayan daha kolay bir yol buldum:

Color.parseColor(getString(R.color.idname);

İlginç, rengi bu şekilde bir dize olarak alabileceğinizi fark etmedim. Daha kolay olduğunu sanmıyorum, ama ilginç 😅
ataulm

0

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;
  }
}


0

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_INTaş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));
}

0
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))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.