ด้วย Android API 22 ใหม่getResources().getDrawable()
เลิกใช้แล้ว getDrawable()
ตอนนี้วิธีที่ดีที่สุดคือการใช้เพียง
มีอะไรเปลี่ยนแปลง
Resources#getDrawable(int)
และResources#getColor(int)
ถูกคัดค้าน
ด้วย Android API 22 ใหม่getResources().getDrawable()
เลิกใช้แล้ว getDrawable()
ตอนนี้วิธีที่ดีที่สุดคือการใช้เพียง
มีอะไรเปลี่ยนแปลง
Resources#getDrawable(int)
และResources#getColor(int)
ถูกคัดค้าน
คำตอบ:
คุณมีตัวเลือกบางอย่างที่จะจัดการกับการคัดค้านนี้ด้วยวิธีที่ถูกต้อง (และการพิสูจน์ในอนาคต ) ขึ้นอยู่กับชนิดของ drawable ที่คุณกำลังโหลด:
A) drawable พร้อมคุณสมบัติของชุดรูปแบบ
ContextCompat.getDrawable(getActivity(), R.drawable.name);
คุณจะได้รับ Drawable สไตล์เป็นชุดรูปแบบกิจกรรมของคุณสั่ง นี่อาจเป็นสิ่งที่คุณต้องการ
B) drawable ที่ไม่มีแอตทริบิวต์ของธีม
ResourcesCompat.getDrawable(getResources(), R.drawable.name, null);
คุณจะได้รับ drawable unstyled ของคุณแบบเก่า หมายเหตุ: ResourcesCompat.getDrawable()
จะไม่เลิก!
EXTRA) drawable พร้อมกับคุณสมบัติของธีมจากธีมอื่น
ResourcesCompat.getDrawable(getResources(), R.drawable.name, anotherTheme);
คุณควรใช้รหัสต่อไปนี้จากไลบรารีการสนับสนุนแทน:
ContextCompat.getDrawable(context, R.drawable.***)
ใช้วิธีนี้เทียบเท่ากับการโทร:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return resources.getDrawable(id, context.getTheme());
} else {
return resources.getDrawable(id);
}
ในฐานะของ API 21 คุณควรใช้getDrawable(int, Theme)
วิธีการแทนgetDrawable(int)
เนื่องจากจะช่วยให้คุณสามารถดึงวัตถุที่วาดได้ที่เกี่ยวข้องกับรหัสทรัพยากรเฉพาะสำหรับความหนาแน่น / ธีมของหน้าจอที่กำหนด โทรเลิกใช้วิธีการจะเทียบเท่ากับการโทรgetDrawable(int)
getDrawable(int, null)
getDrawable (int id)
วิธีการContext
เรียน นี่เป็นเช่นเดียวกับgetResources().getDrawable(id, getTheme());
และยังใช้ API ใหม่
getDrawable(int, Resources.Theme)
ที่จำเป็นต้องใช้
แทนที่บรรทัดนี้:
getResources().getDrawable(R.drawable.your_drawable)
กับ ResourcesCompat.getDrawable(getResources(), R.drawable.your_drawable, null)
แก้ไข
ResourcesCompat
เลิกใช้แล้วในตอนนี้ แต่คุณสามารถใช้สิ่งนี้:
ContextCompat.getDrawable(this, R.drawable.your_drawable)
(นี่this
คือบริบท)
สำหรับรายละเอียดเพิ่มเติมตามลิงค์นี้: ContextCompat
getResources().getDrawable()
เลิกใช้แล้วใน API ระดับ 22 ตอนนี้เราต้องเพิ่มธีม:getDrawable (int id, ธีม Resources.Theme) (เพิ่มในระดับ API 21)
นี่คือตัวอย่าง:
myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));
นี่คือตัวอย่างวิธีการตรวจสอบสำหรับรุ่นที่ใหม่กว่า:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //>= API 21
myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));
} else {
myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage));
}
Build.VERSION_CODES.LOLLIPOP is API 21
ดังนั้นไม่ควรจะเป็นนี้if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)
หรือif (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP)
? ไม่เป็นไร. จากด้านล่าง "มีการเพิ่มวิธีการใน API 21 แต่ไม่เลิกใช้จนกว่าจะถึง API 22. :)"
คุณสามารถใช้ได้
ContextCompat.getDrawable(getApplicationContext(),R.drawable.example);
ที่ทำงานสำหรับฉัน
เป็นเพียงตัวอย่างของวิธีที่ฉันแก้ไขปัญหาในอาร์เรย์เพื่อโหลด listView หวังว่าจะช่วยได้
mItems = new ArrayList<ListViewItem>();
// Resources resources = getResources();
// mItems.add(new ListViewItem(resources.getDrawable(R.drawable.az_lgo), getString(R.string.st_az), getString(R.string.all_nums)));
// mItems.add(new ListViewItem(resources.getDrawable(R.drawable.ca_lgo), getString(R.string.st_ca), getString(R.string.all_nums)));
// mItems.add(new ListViewItem(resources.getDrawable(R.drawable.co_lgo), getString(R.string.st_co), getString(R.string.all_nums)));
mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.az_lgo, null), getString(R.string.st_az), getString(R.string.all_nums)));
mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.ca_lgo, null), getString(R.string.st_ca), getString(R.string.all_nums)));
mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.co_lgo, null), getString(R.string.st_co), getString(R.string.all_nums)));
ลองสิ่งนี้:
public static List<ProductActivity> getCatalog(Resources res){
if(catalog == null) {
catalog.add(new Product("Dead or Alive", res
.getDrawable(R.drawable.product_salmon),
"Dead or Alive by Tom Clancy with Grant Blackwood", 29.99));
catalog.add(new Product("Switch", res
.getDrawable(R.drawable.switchbook),
"Switch by Chip Heath and Dan Heath", 24.99));
catalog.add(new Product("Watchmen", res
.getDrawable(R.drawable.watchmen),
"Watchmen by Alan Moore and Dave Gibbons", 14.99));
}
}
หากคุณกำหนดเป้าหมาย SDK> 21 (อมยิ้มหรือ 5.0) ใช้
context.getDrawable(R.drawable.your_drawable_name)
getDrawable (int drawable)เลิกใช้แล้วใน API ระดับ 22 สำหรับการอ้างอิงดูลิงค์นี้นี้
ตอนนี้เพื่อแก้ไขปัญหานี้เราต้องส่งคอนสตรัคเตอร์ใหม่พร้อมกับ id เช่น: -
getDrawable(int id, Resources.Theme theme)
สำหรับแนวทางแก้ไขให้ทำดังนี้: -
ใน Java: -
ContextCompat.getDrawable(getActivity(), R.drawable.name);
หรือ
imgProfile.setImageDrawable(getResources().getDrawable(R.drawable.img_prof, getApplicationContext().getTheme()));
ใน Kotlin: -
rel_week.background=ContextCompat.getDrawable(this.requireContext(), R.color.colorWhite)
หรือ
rel_day.background=resources.getDrawable(R.drawable.ic_home, context?.theme)
หวังว่านี่จะช่วยคุณได้ขอบคุณ
en api ระดับ 14
marker.setIcon(ResourcesCompat.getDrawable(getResources(), R.drawable.miubicacion, null));
ตอนนี้คุณต้องใช้สิ่งนี้
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //>= API 21
//
} else {
//
}
การติดตามโค้ดบรรทัดเดียวเพียงพอแล้วทุกอย่างจะดูแลโดย ContextCompat.getDrawable
ContextCompat.getDrawable(this, R.drawable.your_drawable_file)
สำหรับบางคนที่ยังคงมีปัญหานี้เพื่อแก้ไขแม้หลังจากใช้ข้อเสนอแนะของเธรดนี้ (ฉันเคยเป็นเช่นนั้น) เพิ่มบรรทัดนี้ในคลาสแอปพลิเคชันของคุณวิธี onCreate ()
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
ตามที่แนะนำ ที่นี่และที่นี่บางครั้งจำเป็นต้องเข้าถึงเวกเตอร์จากแหล่งข้อมูลโดยเฉพาะเมื่อคุณจัดการกับรายการเมนู ฯลฯ
ใน Kotlin คุณสามารถใช้ส่วนขยาย
fun Context.getMyDrawable(id : Int) : Drawable?{
return ContextCompat.getDrawable(this, id)
}
จากนั้นใช้เช่น
context.getMyDrawable(R.drawable.my_icon)
Build.VERSION_CODES.LOLLIPOP ควรเปลี่ยนเป็น BuildVersionCodes.Lollipop เช่น:
if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop) {
this.Control.Background = this.Resources.GetDrawable(Resource.Drawable.AddBorder, Context.Theme);
} else {
this.Control.Background = this.Resources.GetDrawable(Resource.Drawable.AddBorder);
}
BuildVersionCodes
คลาสเฉพาะของซามารินใช่ไหม
getDrawable (int id)
ของคลาสResources
นั้นเลิกใช้แล้ว ตอนนี้คุณควรใช้วิธีการgetDrawable (int id, Resources.Theme theme)
กับพารามิเตอร์ชุดรูปแบบใหม่