Получить color-int из цветового ресурса
есть ли способ получить color-int из цветового ресурса? Я пытаюсь получить отдельные красные, синие и зеленые компоненты цвета, определенного в ресурсе (R. color.myColor), чтобы я мог установить значения трех панелей поиска на определенный уровень.
для получения дополнительной информации о другом прецеденте, который может помочь решить этот вопрос в результатах поиска, я хотел применить alpha к цвету, определенному в моих ресурсах.
использование @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)
is устаревший теперь, это должно быть использовано :
ContextCompat.getColor(context, R.color.your_color);
(добавлено в библиотеку поддержки 23)
EDIT (2):
ниже код может использоваться как для pre и post зефир (API 23)
ResourcesCompat.getColor(getResources(), R.color.your_color, null); //without theme
ResourcesCompat.getColor(getResources(), R.color.your_color, your_theme); //with theme
на основе нового Библиотека Поддержки Android (и этой update), теперь вы должны позвонить:
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
class или создать один, если не существует.
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;
}
}