Uzyskaj kolor-int z zasobu kolorów

448

Czy istnieje sposób na uzyskanie koloru z zasobu kolorów? Usiłuję uzyskać poszczególne składniki czerwony, niebieski i zielony koloru zdefiniowanego w zasobie (R.color.myColor), aby móc ustawić wartości trzech pasków wyszukiwania na określonym poziomie.

ataulm
źródło

Odpowiedzi:

928

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
sob
źródło
7
co z android.R.color.some_color :-(
Blundell,
17
@Blundell uhh, nie wiem, jeśli potrzebujesz go teraz, ale działa to android.R.color.some_colorrównież na przykład: getResources().getColor(android.R.color.holo_blue_bright)(przynajmniej na API 17)
ataulm
30
getColor () jest teraz przestarzałe, możesz użyć: ContextCompat.getColor (kontekst, R.color.your_color);
Ricardo
2
Zdaję sobie sprawę, że to nie ty dokonałeś zmian, ale jaka jest różnica między ContextCompati ResourcesCompat? Jeśli nie ma praktycznej różnicy, byłoby mniej mylące, gdybyś usunął jeden z nich z odpowiedzi.
Suragch
14
Dlaczego Google odczuwa potrzebę rezygnacji z doskonałej funkcji tej okropnej biblioteki kompaktowych aplikacji. To do bani, mieć oba.
Andrew S,
116

W oparciu o nową bibliotekę obsługi Androida (i 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 ThemeOverlaywykorzystanie 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

Nick Butcher - Droidcon Berlin - Stylowe tworzenie tematów

Ultimo_m
źródło
10
Dla tych, którzy zastanawiają się, co wypełnić jako motyw w nowej metodzie, Thememoż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ć.
w3bshark
hmm ... wszyscy tak mówią, ale nie mogę tego uruchomić. Czy muszę inicjować kontekst? Obecnie dostaję komunikat „Nie mogę rozwiązać kontekstu symbolu”
ColdTuna,
Aby upewnić się, że robisz to dobrze, spróbuj wywołać ją w ramach działania onCreate, niż aby uzyskać kontekst, musisz wywołać metodę getContext () lub po prostu „this”
Ultimo_m
35

Określ swój kolor

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>

Uzyskaj kolor int i ustaw go

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

Zobacz też

Suragch
źródło
1
możesz użyć tylko getResources()w Activitylub Fragment?
Zapnologica,
2
@Zapnologica, zobacz odpowiedzi na to pytanie, aby uzyskać przemyślenia na temat używania getResources()poza działaniem lub fragmentem.
Suragch,
1
@Zapnologica no. getResources()jest również dostępny jako publiczny interfejs API we wszystkich elementach implementujących kontekst, a także w widokach.
ataulm
7

Najlepsze podejście

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

To co robię jest

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

Problem (gdy nie masz kontekstu)

Kiedy nie masz Contextdostępu , jak metoda w swojej Utilklasie.

Załóżmy poniższą metodę bez kontekstu.

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

Teraz przejdziesz Contextjako 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 Resourcesdo swojej Applicationklasy 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 <applicationtagu. (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.

Khemraj
źródło
5

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));
    }
}
ninjachippie
źródło
dlaczego nie korzystać ze starej wersji we wszystkich przypadkach lub jeśli mimo to sprawdzasz wersję, użyj nowego interfejsu API, Resources.getColor(int, Theme)jeśli możesz? Nie należy wychwytywać wyjątków czasu wykonywania.
ataulm
Chyba tylko OCD. ContextCompat wydaje mi się przyszłym sposobem na zrobienie tego, a zatem właściwą drogą. Więc moim podejściem jest robienie tego we właściwy sposób. A jeśli to się nie powiedzie (na starych urządzeniach lub czymkolwiek), zrób to po staremu. Dlaczego nie mam wychwytywać wyjątków w czasie wykonywania?
ninjachippie
1

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)
);
ataulm
źródło
1

Znaleziono łatwiejszy sposób, który również działa:

Color.parseColor(getString(R.color.idname);
geckoflume
źródło
Ciekawe, nie zdawałem sobie sprawy, że w ten sposób można uzyskać kolor jako sznurek. Nie wydaje mi się, żeby było łatwiej, ale jest interesująco 😅
ataulm
0

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. enumoferuje 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;
  }
}
Dezorientować
źródło
0

Najnowsza metoda pracy:

getColor(R.color.snackBarAction)
zohaib Ansari
źródło
0

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));
}
Blasanka
źródło
0
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))
indrajeet jyoti
źródło