Как я могу получить color-int из цветового ресурса?

Есть ли способ получить color-int из цветового ресурса?

Я пытаюсь получить отдельные красные, синие и зеленые компоненты цвета, определенного в ресурсе (R.color.myColor), чтобы я мог установить значения трех полос поиска на определенный уровень.


person ataulm    schedule 11.03.2011    source источник


Ответы (12)


Вы можете использовать:

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
person sat    schedule 11.03.2011
comment
что насчет android.R.color.some_color :-( - person Blundell; 18.06.2012
comment
@Blundell эээ, не знаю, нужно ли вам сейчас, но это работает и для android.R.color.some_color, например: getResources().getColor(android.R.color.holo_blue_bright) (по крайней мере, на API 17) - person ataulm; 01.07.2013
comment
Как производительность этого? Стоит ли кешировать результат, чтобы мне не приходилось каждый раз искать его, или Android делает это внутренне? - person karl; 20.03.2014
comment
@karl преждевременно не оптимизируйте. Это непродолжительная операция, и, учитывая, что параметр является идентификатором, скорее всего, это простой поиск. Resources src, если вы хотите посмотреть - person ataulm; 26.03.2014
comment
@RestInPeace извлеките его в метод int getMyColor() { ... }. Вы можете сохранить цвет в переменной, если многословность влияет на ясность вашего кода - хотя я бы не стал этого делать из соображений производительности - person ataulm; 02.09.2014
comment
Этот вызов устарел в API23. Но вместо этого вы можете позвонить getResources().getColor(R.color.idname, null); - person w3bshark; 12.09.2015
comment
getColor () устарела, вы можете использовать: ContextCompat.getColor (context, R.color.your_color); - person Ricardo; 19.11.2015
comment
Я понимаю, что редактировали не вы, но в чем разница между ContextCompat и ResourcesCompat? Если нет практической разницы, будет менее запутанно, если вы удалите один из них из своего ответа. - person Suragch; 01.11.2016
comment
Почему Google считает необходимым отказаться от идеально хорошей функции для этой ужасной компактной библиотеки приложений? Отстой, есть и то, и другое. - person Andrew S; 18.11.2016
comment
@ Андрей Я согласен. Тем более, что я использую APKBuilder, у которого нет библиотек поддержки или совместимости. - person ; 30.08.2019
comment
Я постоянно трепещу перед ужасом этой платформы ... не могу подобрать слов. - person FranticRock; 17.02.2020

На основе новой библиотеки поддержки 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.

Особенно это необходимо, когда в одной и той же деятельности вы используете разные темы, например темную / светлую тему. Если вы хотите больше узнать о темах и стилях, предлагается этот доклад: Разработка тем со стилем

Ник Батчер - Droidcon Berlin - Стильная разработка тем

person Ultimo_m    schedule 27.08.2015
comment
Для тех, кто задается вопросом, что указать в качестве темы в новом методе, Theme можно передать как null, поэтому просто вызовите getColor(R.color.my_color, null), если вы не уверены, какую тему передать. - person w3bshark; 12.09.2015
comment
хм ... это то, что все говорят, но я не могу заставить это работать. Мне нужно инициализировать контекст? В настоящее время я получаю сообщение «Не могу разрешить контекст» символа - person Caio Mar; 27.09.2017
comment
Чтобы убедиться, что вы делаете это правильно, попробуйте вызвать его внутри onCreate действия, чем для получения контекста вам нужно вызвать getContext () или просто этот - person Ultimo_m; 27.09.2017

Определите свой цвет

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 и установите его

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

Смотрите также

person Suragch    schedule 20.05.2015
comment
Вы можете использовать getResources() только в Activity или Fragment? - person Zapnologica; 08.07.2015
comment
@Zapnologica, см. Ответы на этот вопрос, чтобы узнать об использовании getResources() вне Действие или фрагмент. - person Suragch; 08.07.2015
comment
@Zapnologica no. 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); в любом месте приложения.

person Khemraj Sharma    schedule 11.07.2018

Я обновился, чтобы использовать 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));
    }
}
person ninjachippie    schedule 09.03.2016
comment
почему бы не использовать старую версию во всех случаях или, если вы все равно проверяете версию, использовать новый API Resources.getColor(int, Theme), если можете? Вы не должны перехватывать исключения времени выполнения. - person ataulm; 09.03.2016
comment
Полагаю, просто ОКР. ContextCompat, как мне кажется, является надежным в будущем способом сделать это, а значит, и правильным способом. Так что мой подход таков: делайте это правильно. И если это не удается (на старых устройствах или что-то еще), делайте это по-старому. Почему мне не следует перехватывать исключения во время выполнения? - person ninjachippie; 10.03.2016

Нашел более простой способ, который тоже работает:

Color.parseColor(getString(R.color.idname);
person geckoflume    schedule 18.04.2020
comment
Интересно, что не понимал, что таким образом можно получить цвет в виде строки. Не думаю, что это проще, но это интересно ???? - person ataulm; 19.04.2020
comment
это кажется неправильным, но это работает. Сумасшедший: D - person goemic; 07.04.2021

Если ваш текущий мин. Уровень 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));
}
person Blasanka    schedule 12.01.2020

Для получения дополнительной информации о другом варианте использования, который может помочь выявить этот вопрос в результатах поиска, я хотел применить альфа-канал к цвету, определенному в моих ресурсах.

Используя правильный ответ @ 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)
);
person ataulm    schedule 31.10.2019

Доступ к цветам из неактивного класса может быть затруднен. Одна из найденных мною альтернатив - использование 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;
  }
}
person Confuse    schedule 01.08.2018

Самый последний метод работы:

getColor(R.color.snackBarAction)
person zedlabs    schedule 08.01.2020

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))
person indrajeet jyoti    schedule 17.07.2019

или если у вас есть функция (текст строки, цвет строки), и вам нужно передать строку цвета ресурса, вы можете сделать следующее

String.valueOf(getResources().getColor(R.color.enurse_link_color)
person Van Mart    schedule 18.08.2020