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.

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

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


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ż


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.


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

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

1

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

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

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


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

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))
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.