Получить color-int из цветового ресурса
есть ли способ получить color-int из цветового ресурса?
Я пытаюсь получить отдельные красные, синие и зеленые компоненты цвета, определенного в ресурсе (R. color.myColor), чтобы я мог установить значения трех панелей поиска на определенный уровень.
для получения дополнительной информации о другом случае использования, который может помочь решить этот вопрос в результатах поиска, я хотел применить альфа к цвету, определенному в моих ресурсах.
использование @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)
);
6 ответов:
вы можете использовать:
getResources().getColor(R.color.idname);проверьте здесь, как определить пользовательские цвета:
http://sree.cc/google/android/defining-custom-colors-using-xml-in-android
EDIT(1): Так как
getColor(int id)- это устаревший теперь, это должно быть использовано :ContextCompat.getColor(context, R.color.your_color);(добавлено в библиотеку поддержки 23)
EDIT(2):
ниже код может быть использован как для пре и пост зефир (API 23)
ResourcesCompat.getColor(getResources(), R.color.your_color, null); //without theme ResourcesCompat.getColor(getResources(), R.color.your_color, your_theme); //with theme
на основе нового Библиотека Поддержки Android (и этой обновление), теперь вы должны вызвать:
ContextCompat.getColor(context, R.color.name.color);по словам документация:
public int getColor (int id)этот метод был исключен в уровень API 23. Используйте getColor (int, Theme) вместо
это то же самое решение для
getResources().getColorStateList(id):вы должны изменить его следующим образом:
ContextCompat.getColorStateList(getContext(),id);
определить цвет
ценностей/цвет.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 и установить его
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);см. также
Я обновлен, чтобы использовать
ContextCompat.getColor(context, R.color.your_color);но иногда (на некоторых устройствах/версиях Android. Я не уверен), что вызывает NullPointerExcepiton.поэтому, чтобы заставить его работать на всех устройствах/версиях, я возвращаюсь к старому способу сделать это, в случае нулевого указателя.
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)); } }
Лучший Подход
как @sat ответ, хороший подход для получения цвета является
ResourcesCompat.getColor(getResources(), R.color.your_color, null);или использовать ниже способ, когда у вас нет доступа к
getResources()метод.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); }он наиболее прост в использовании в любом месте вашего приложения! Даже в классе Util или любом классе, где у вас нет контекста или getResource ()
проблема (когда у вас нет контекста)
, когда вы не надо
Contextоткрыть, как метод в вашейUtilкласса.предположим, что ниже метод без контекста.
public void someMethod(){ ... // can't use getResource() without Context. }теперь вы пройдете
Contextв качестве параметра в этот метод и использоватьgetResources().public void someMethod(Context context){ ... context.getResources... }так вот бонус уникальное решение С помощью которого вы можете получить доступ к ресурсам из любого места, как
Util class. ДобавитьResourcesнаApplicationкласс или создать один, если не существует.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тег. (Если не добавлено уже)<application android:name=".App" ... > ... </application>теперь вы хорошо идти. Используйте
ResourcesCompat.getColor(App.getRes(), R.color.your_color, null);в любом месте в приложение.
доступ к цветам из класса без активности может быть затруднен. Один из вариантов, который я нашел, был с помощью
enum.enumпредлагает большую гибкость.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; } }
Comments