Odpowiedzi:
Możesz użyć:
getResources().getColor(R.color.idname);
Sprawdź tutaj, jak zdefiniować niestandardowe kolory:
http://sree.cc/google/android/defining-custom-colors-using-xml-in-android
EDYCJA (1):
Ponieważ getColor(int id)
jest już przestarzałe , należy go użyć:
ContextCompat.getColor(context, R.color.your_color);
(dodano w bibliotece wsparcia 23)
EDYCJA (2):
Poniższy kod może być używany zarówno przed, jak i po Marshmallow (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
również na przykład: getResources().getColor(android.R.color.holo_blue_bright)
(przynajmniej na API 17)
ContextCompat
i ResourcesCompat
? Jeśli nie ma praktycznej różnicy, byłoby mniej mylące, gdybyś usunął jeden z nich z odpowiedzi.
W oparciu o nową bibliotekę obsługi Androida (i tę aktualizację) teraz powinieneś zadzwonić:
ContextCompat.getColor(context, R.color.name.color);
Zgodnie z dokumentacją :
public int getColor (int id)
Ta metoda została uznana za przestarzałą na poziomie API 23 . Zamiast tego użyj getColor (int, Theme)
Jest to to samo rozwiązanie dla getResources().getColorStateList(id)
:
Musisz to zmienić w następujący sposób:
ContextCompat.getColorStateList(getContext(),id);
EDYCJA 2019
Jeśli chodzi o ThemeOverlay
wykorzystanie kontekstu najbliższego widoku:
val color = ContextCompat.getColor(
closestView.context,
R.color.name.color
)
W ten sposób uzyskasz odpowiedni kolor w oparciu o ThemeOverlay.
Szczególnie potrzebne, gdy w tej samej aktywności używasz różnych motywów, takich jak motyw ciemno / jasny. Jeśli chcesz dowiedzieć się więcej o motywach i stylach, ta rozmowa jest sugerowana: Rozwijanie motywów ze stylem
Theme
można przekazać jako zero, więc zadzwoń, getColor(R.color.my_color, null)
jeśli nie masz pewności, który motyw należy przekazać.
wartości / 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()
w Activity
lub Fragment
?
getResources()
poza działaniem lub fragmentem.
getResources()
jest również dostępny jako publiczny interfejs API we wszystkich elementach implementujących kontekst, a także w widokach.
W odpowiedzi @sat dobrym podejściem jest uzyskanie koloru
ResourcesCompat.getColor(getResources(), R.color.your_color, null);
lub użyj poniżej, gdy nie masz dostępu do getResources()
metody.
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);
}
Jest najprostszy w użyciu w dowolnym miejscu w aplikacji! Nawet w klasie Util lub dowolnej klasie, w której nie masz Context lub getResource ()
Kiedy nie masz Context
dostępu , jak metoda w swojej Util
klasie.
Załóżmy poniższą metodę bez kontekstu.
public void someMethod(){
...
// can't use getResource() without Context.
}
Teraz przejdziesz Context
jako parametr w tej metodzie i użyjeszgetResources().
public void someMethod(Context context){
...
context.getResources...
}
Oto wyjątkowe rozwiązanie premiowe, dzięki któremu można uzyskać dostęp do zasobów z dowolnego miejsca Util class
. Dodaj Resources
do swojej Application
klasy lub Utwórz, jeśli nie istnieje.
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;
}
}
Dodaj pole nazwy do manifest.xml
<application
tagu. (Jeśli jeszcze nie dodano)
<application
android:name=".App"
...
>
...
</application>
Teraz możesz już iść. Używaj w ResourcesCompat.getColor(App.getRes(), R.color.your_color, null);
dowolnym miejscu aplikacji.
Zaktualizowałem, aby użyć, ContextCompat.getColor(context, R.color.your_color);
ale czasami (na niektórych urządzeniach / wersjach Androida. Nie jestem pewien), który powoduje NullPointerExcepiton.
Aby więc działało na wszystkich urządzeniach / wersjach, wracam do starego sposobu robienia tego, w przypadku wskaźnika zerowego.
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)
jeśli możesz? Nie należy wychwytywać wyjątków czasu wykonywania.
Aby uzyskać więcej informacji na temat innego przypadku użycia, który może pomóc znaleźć to pytanie w wynikach wyszukiwania, chciałem zastosować alfa do koloru zdefiniowanego w moich zasobach.
Używając poprawnej odpowiedzi @ sat:
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)
);
Znaleziono łatwiejszy sposób, który również działa:
Color.parseColor(getString(R.color.idname);
Dostęp do kolorów z klasy bez aktywności może być trudny. Jedną z alternatyw, które znalazłem, było użycie enum
. enum
oferuje dużą elastyczność.
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;
}
}
Najnowsza metoda pracy:
getColor(R.color.snackBarAction)
Jeśli twój obecny min. Poziom interfejsu API to 23, możesz po prostu używać getColor()
tak, jak my używamy do getString()
:
//example
textView.setTextColor(getColor(R.color.green));
// if context is not available(ex: not in activity) use with context.getColor()
Jeśli chcesz poniżej poziomu interfejsu API 23
, użyj tego:
textView.setTextColor(getResources().getColor(R.color.green));
Należy jednak pamiętać, że getResources().getColor()
jest to przestarzałe na poziomie interfejsu API 23
. W takim przypadku zamień powyżej na:
textView.setTextColor(ContextCompat.getColor(this /*context*/, R.color.green)) //Im in an activity, so I can use `this`
ContextCompat : Pomocnik do uzyskiwania dostępu do funkcji wContext
Jeśli chcesz, możesz ograniczyć za pomocą SDK_INT
:
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);
w działalności
ContextCompat.getColor(actvityname.this, R.color.your_color);
we fragmencie
ContextCompat.getColor(getActivity(), R.color.your_color);
na przykład:
tvsun.settextcolour(ContextCompat.getColor(getActivity(), R.color.your_color))