Jawaban:
Kamu bisa menggunakan:
getResources().getColor(R.color.idname);
Lihat di sini tentang cara menentukan warna khusus:
http://sree.cc/google/android/defining-custom-colors-using-xml-in-android
EDIT (1):
Karena getColor(int id)
sudah usang sekarang, ini harus digunakan:
ContextCompat.getColor(context, R.color.your_color);
(ditambahkan di perpustakaan dukungan 23)
EDIT (2):
Kode di bawah ini dapat digunakan untuk pre dan post 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
juga misalnya: getResources().getColor(android.R.color.holo_blue_bright)
(setidaknya, pada API 17)
ContextCompat
dan ResourcesCompat
? Jika tidak ada perbedaan praktis, itu akan kurang membingungkan jika Anda menghapus salah satu dari mereka dari jawaban Anda.
Berdasarkan Pustaka Dukungan Android yang baru (dan pembaruan ini ), sekarang Anda harus menelepon:
ContextCompat.getColor(context, R.color.name.color);
Menurut dokumentasi :
public int getColor (int id)
Metode ini sudah tidak digunakan lagi di API level 23 . Gunakan getColor (int, Theme) sebagai gantinya
Ini adalah solusi yang sama untuk getResources().getColorStateList(id)
:
Anda harus mengubahnya seperti ini:
ContextCompat.getColorStateList(getContext(),id);
EDIT 2019
Mengenai ThemeOverlay
penggunaan konteks tampilan terdekat:
val color = ContextCompat.getColor(
closestView.context,
R.color.name.color
)
Jadi dengan cara ini Anda mendapatkan warna yang tepat berdasarkan ThemeOverlay Anda.
Dibutuhkan khusus ketika dalam aktivitas yang sama Anda menggunakan tema yang berbeda, seperti tema gelap / terang. Jika Anda ingin lebih memahami tentang Tema dan Gaya, pembicaraan ini disarankan: Mengembangkan Tema dengan Gaya
Theme
dapat dinyatakan sebagai nol, jadi panggil saja getColor(R.color.my_color, null)
jika Anda tidak yakin tema apa yang harus dilewati.
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()
dalam Activity
atau Fragment
?
getResources()
luar Aktivitas atau Fragmen.
getResources()
juga tersedia sebagai API publik tentang apa pun yang menerapkan Konteks dan juga pada Tampilan.
Sebagai jawaban @sat, pendekatan yang baik untuk mendapatkan warna adalah
ResourcesCompat.getColor(getResources(), R.color.your_color, null);
atau gunakan cara di bawah ini ketika Anda tidak memiliki akses ke getResources()
metode.
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);
}
Ini paling mudah digunakan di mana saja di aplikasi Anda! Bahkan di kelas Util atau kelas mana pun di mana Anda tidak memiliki Konteks atau getResource ()
Ketika Anda tidak memiliki Context
akses , sukai metode di Util
kelas Anda .
Asumsikan metode di bawah ini tanpa Konteks.
public void someMethod(){
...
// can't use getResource() without Context.
}
Sekarang Anda akan lulus Context
sebagai parameter dalam metode ini dan gunakangetResources().
public void someMethod(Context context){
...
context.getResources...
}
Jadi di sini adalah solusi unik Bonus di mana Anda dapat mengakses sumber daya dari mana saja seperti Util class
. Tambahkan Resources
ke Application
kelas Anda atau Buat satu jika tidak ada.
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;
}
}
Tambahkan bidang nama ke manifest.xml
<application
tag Anda . (Jika belum ditambahkan)
<application
android:name=".App"
...
>
...
</application>
Sekarang kamu baik untuk pergi. Gunakan ResourcesCompat.getColor(App.getRes(), R.color.your_color, null);
di mana saja di aplikasi.
Saya memperbarui untuk menggunakan ContextCompat.getColor(context, R.color.your_color);
tetapi kadang-kadang (Pada beberapa perangkat / versi Android. Saya tidak yakin) yang menyebabkan NullPointerExcepiton.
Jadi untuk membuatnya bekerja pada semua perangkat / versi, saya kembali pada cara lama melakukannya, dalam kasus null pointer.
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)
jika Anda bisa? Anda seharusnya tidak menangkap pengecualian runtime.
Untuk informasi lebih lanjut tentang penggunaan-kasus lain yang dapat membantu memunculkan pertanyaan ini dalam hasil pencarian, saya ingin menerapkan alpha ke warna yang didefinisikan dalam sumber daya saya.
Menggunakan jawaban yang benar @ 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)
);
Mengakses warna dari kelas non-aktivitas bisa jadi sulit. Salah satu alternatif yang saya temukan menggunakan enum
. enum
menawarkan banyak fleksibilitas.
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;
}
}
Metode kerja terbaru:
getColor(R.color.snackBarAction)
Jika min Anda saat ini. Level API 23, Anda cukup menggunakan getColor()
seperti yang kami gunakan untuk getString()
:
//example
textView.setTextColor(getColor(R.color.green));
// if context is not available(ex: not in activity) use with context.getColor()
Jika Anda ingin di bawah level API 23
, cukup gunakan ini:
textView.setTextColor(getResources().getColor(R.color.green));
Tetapi perhatikan bahwa getResources().getColor()
sudah usang di Level API 23
. Jika demikian ganti di atas dengan:
textView.setTextColor(ContextCompat.getColor(this /*context*/, R.color.green)) //Im in an activity, so I can use `this`
ContextCompat : Helper untuk mengakses fitur dalamContext
Jika Anda mau, Anda bisa membatasi dengan SDK_INT
seperti di bawah ini:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
textView.setTextColor(getColor(R.color.green));
} else {
textView.setTextColor(getResources().getColor(R.color.green));
}
ContextCompat.getColor(context, R.color.your_color);
dalam aktivitas
ContextCompat.getColor(actvityname.this, R.color.your_color);
dalam fragmen
ContextCompat.getColor(getActivity(), R.color.your_color);
sebagai contoh:
tvsun.settextcolour(ContextCompat.getColor(getActivity(), R.color.your_color))