ฉันจะรับรหัสทรัพยากรของรูปภาพได้อย่างไรถ้าฉันรู้ชื่อ (ใน Android)
ฉันจะรับรหัสทรัพยากรของรูปภาพได้อย่างไรถ้าฉันรู้ชื่อ (ใน Android)
คำตอบ:
ด้วยสิ่งนี้:
String mDrawableName = "myappicon";
int resID = getResources().getIdentifier(mDrawableName , "drawable", getPackageName());
getResources().getIdentifier(name, "id", getPackageName());
เพื่อรับ ID ของ ImageButton (เหมือนที่คุณทำกับ R.id.name)
name
? ฉันต้องการค้นหารหัสของปุ่มที่มีข้อมูลอ้างอิงที่ฉันรู้ในกรณีของฉันคือbutton1
getResource()
และgetPackageName()
แสดงข้อผิดพลาด cannot resolve method
getResource()
และgetPackageName()
เป็นวิธีการจากกิจกรรม
คุณยังสามารถลองสิ่งนี้:
try {
Class res = R.drawable.class;
Field field = res.getField("drawableName");
int drawableId = field.getInt(null);
}
catch (Exception e) {
Log.e("MyTag", "Failure to get drawable id.", e);
}
ฉันได้คัดลอกซอร์สโค้ดนี้จาก URL ด้านล่าง จากการทดสอบในหน้านี้เร็วกว่า getIdentifier () 5 เท่า ฉันยังพบว่ามันสะดวกและใช้งานง่ายกว่า หวังว่ามันจะช่วยคุณเช่นกัน
ตัวอย่างทรัพยากรระบบสาธารณะ:
// this will get id for android.R.drawable.ic_dialog_alert
int id = Resources.getSystem().getIdentifier("ic_dialog_alert", "drawable", "android");
อีกวิธีหนึ่งคือการอ้างอิงเอกสารสำหรับคลาสandroid.R.drawable
คุณสามารถใช้ฟังก์ชันนี้เพื่อรับรหัสทรัพยากร:
public static int getResourseId(Context context, String pVariableName, String pResourcename, String pPackageName) throws RuntimeException {
try {
return context.getResources().getIdentifier(pVariableName, pResourcename, pPackageName);
} catch (Exception e) {
throw new RuntimeException("Error getting Resource ID.", e)
}
}
ดังนั้นหากคุณต้องการรับรหัสทรัพยากรแบบวาดได้คุณสามารถเรียกใช้เมธอดดังนี้:
getResourseId(MyActivity.this, "myIcon", "drawable", getPackageName());
(หรือจากส่วนย่อย):
getResourseId(getActivity(), "myIcon", "drawable", getActivity().getPackageName());
สำหรับString Resource ID คุณสามารถเรียกมันได้ดังนี้:
getResourseId(getActivity(), "myAppName", "string", getActivity().getPackageName());
ฯลฯ ...
ข้อควรระวัง : มันพ่น RuntimeException หากไม่พบรหัสทรัพยากร อย่าลืมกู้คืนอย่างถูกต้องในการผลิต
static
มิฉะนั้นgetResources()
จะไม่ได้ผล
Context
นั้นไม่สามารถใช้ได้ การแก้ไขคือการลบstatic
และย้ายไปเป็นContext
(เช่นActivity
หรือApplication
); หรือการแก้ไขทางเลือกคือสิ่งที่โจนาธานทำในการแก้ไขของเขาซึ่งก็คือการส่งต่อContext
ไปยังวิธีการ
อีกสถานการณ์หนึ่งที่ฉันพบ
สตริง imageName = "สวัสดี" จากนั้นเมื่อส่งผ่านไปยังฟังก์ชัน getIdentifier เป็นอาร์กิวเมนต์แรกชื่อจะส่งผ่านชื่อที่มีการยกเลิกสตริงว่างและจะคืนค่าศูนย์เสมอ ส่ง imageName.substring นี้ (0, imageName.length () - 1)