Есть ли способ получить color-int из цветового ресурса?
Я пытаюсь получить отдельные красные, синие и зеленые компоненты цвета, определенного в ресурсе (R.color.myColor), чтобы я мог установить значения трех полос поиска на определенный уровень.
Есть ли способ получить color-int из цветового ресурса?
Я пытаюсь получить отдельные красные, синие и зеленые компоненты цвета, определенного в ресурсе (R.color.myColor), чтобы я мог установить значения трех полос поиска на определенный уровень.
Вы можете использовать:
getResources().getColor(R.color.idname);
Узнайте здесь, как определить собственные цвета:
http://sree.cc/google/android/defining-custom-colors-using-xml-in-android
РЕДАКТИРОВАТЬ (1): поскольку getColor(int id)
устарел, необходимо использовать следующее:
ContextCompat.getColor(context, R.color.your_color);
(добавлено в библиотеку поддержки 23)
ИЗМЕНИТЬ (2):
Приведенный ниже код может использоваться как до, так и после 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
, например: getResources().getColor(android.R.color.holo_blue_bright)
(по крайней мере, на API 17)
- person ataulm; 01.07.2013
int getMyColor() { ... }
. Вы можете сохранить цвет в переменной, если многословность влияет на ясность вашего кода - хотя я бы не стал этого делать из соображений производительности
- person ataulm; 02.09.2014
getResources().getColor(R.color.idname, null);
- person w3bshark; 12.09.2015
ContextCompat
и ResourcesCompat
? Если нет практической разницы, будет менее запутанно, если вы удалите один из них из своего ответа.
- person Suragch; 01.11.2016
На основе новой библиотеки поддержки 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);
ИЗМЕНИТЬ 2019
Что касается ThemeOverlay
, используйте контекст ближайшего представления:
val color = ContextCompat.getColor(
closestView.context,
R.color.name.color
)
Таким образом, вы получите правильный цвет на основе вашего ThemeOverlay.
Особенно это необходимо, когда в одной и той же деятельности вы используете разные темы, например темную / светлую тему. Если вы хотите больше узнать о темах и стилях, предлагается этот доклад: Разработка тем со стилем
Theme
можно передать как null, поэтому просто вызовите getColor(R.color.my_color, null)
, если вы не уверены, какую тему передать.
- person w3bshark; 12.09.2015
values / 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()
только в Activity
или Fragment
?
- person Zapnologica; 08.07.2015
getResources()
вне Действие или фрагмент.
- person Suragch; 08.07.2015
getResources()
также доступен как общедоступный API для всего, что реализует контекст, а также для представлений.
- person ataulm; 12.08.2015
Как отвечает @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 или любом классе, где у вас нет Context или 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);
в любом месте приложения.
Я обновился, чтобы использовать 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));
}
}
Resources.getColor(int, Theme)
, если можете? Вы не должны перехватывать исключения времени выполнения.
- person ataulm; 09.03.2016
Нашел более простой способ, который тоже работает:
Color.parseColor(getString(R.color.idname);
Если ваш текущий мин. Уровень API - 23, вы можете просто использовать getColor()
, как мы используем для getString()
:
//example
textView.setTextColor(getColor(R.color.green));
// if context is not available(ex: not in activity) use with context.getColor()
Если вы хотите, чтобы уровень API был ниже 23
, просто используйте это:
textView.setTextColor(getResources().getColor(R.color.green));
Но обратите внимание, что getResources().getColor()
устарел на уровне API 23
. В этом случае замените выше на:
textView.setTextColor(ContextCompat.getColor(this /*context*/, R.color.green)) //Im in an activity, so I can use `this`
ContextCompat: помощник для доступа к функциям в _ 9_
Если хотите, можете ограничить 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));
}
Для получения дополнительной информации о другом варианте использования, который может помочь выявить этот вопрос в результатах поиска, я хотел применить альфа-канал к цвету, определенному в моих ресурсах.
Используя правильный ответ @ 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)
);
Доступ к цветам из неактивного класса может быть затруднен. Одна из найденных мною альтернатив - использование 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;
}
}
Самый последний метод работы:
getColor(R.color.snackBarAction)
ContextCompat.getColor(context, R.color.your_color);
в действии
ContextCompat.getColor(actvityname.this, R.color.your_color);
во фрагменте
ContextCompat.getColor(getActivity(), R.color.your_color);
Например:
tvsun.settextcolour(ContextCompat.getColor(getActivity(), R.color.your_color))
или если у вас есть функция (текст строки, цвет строки), и вам нужно передать строку цвета ресурса, вы можете сделать следующее
String.valueOf(getResources().getColor(R.color.enurse_link_color)