Получить 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)
);
754   6  

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

    Ничего не найдено.