Làm cách nào để có được id tài nguyên của hình ảnh nếu tôi biết tên của nó?


Câu trả lời:


269

Với một cái gì đó như thế này:

String mDrawableName = "myappicon";
int resID = getResources().getIdentifier(mDrawableName , "drawable", getPackageName());

10
Cảm ơn, điều đó đã giúp tôi tìm ra giải pháp cho vấn đề simliar! Tôi sẽ sử dụng getResources().getIdentifier(name, "id", getPackageName());để lấy ID của ImageButton (như bạn làm với R.id.name).
Chọn0r

42
Lưu ý rằng tên có thể vẽ KHÔNG nên bao gồm một phần mở rộng như ".png"
larham1

1
chính xác những gì đi trong biến name? Tôi muốn tìm id của một nút có tham chiếu mà tôi biết, trong trường hợp của tôi làbutton1
John Watson

1
getResource()getPackageName()hiển thị lỗi. cannot resolve method
Srujan Barai

@Srujan Barai getResource()getPackageName()là các phương thức từ Activity.
Berga

29

Bạn cũng có thể thử điều này:

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

Tôi đã sao chép mã nguồn này từ URL bên dưới. Dựa trên các thử nghiệm được thực hiện trong trang này, nó nhanh hơn 5 lần so với getIdentifier (). Tôi cũng thấy nó tiện dụng và dễ sử dụng hơn. Hy vọng nó sẽ giúp bạn là tốt.

Liên kết: Tự động truy xuất tài nguyên trong Android


2
việc này có thể nhanh hơn nhưng tôi thấy nó có thể khiến bạn gặp rắc rối nếu bạn sử dụng proguard. Điều này không làm việc trong proguard ít nhất là đối với tôi
Pedro Rainho

Bắt ngoại lệ chung là một ý tưởng đặc biệt xấu. Hơn nữa, lưu ý rằng nếu không có tài liệu tham khảo cứng nào có thể rút ra được, Proguard có thể tối ưu hóa tham chiếu đi vì không tin rằng nó được sử dụng ở bất cứ đâu.
Paul Lammertsma

Tôi hiểu rồi :) bạn có nghĩa là trong quá trình tối ưu hóa drawableName thay đổi và tài nguyên không thể được tìm thấy bằng phương pháp này, nếu tôi đúng? :)
VSB

1
@VSB: nếu nhận xét cuối cùng của bạn là phản hồi cho nhận xét của Paul Lammertsma ngay trên: Không, anh ta có nghĩa là Proguard không biết đây là tài liệu tham khảo cho tài nguyên và vì vậy có thể xóa tài nguyên, tin rằng nó không được sử dụng.
ToolmakerSteve

một khi bạn sử dụng xxxxhdpi, xxhdpi, v.v. thì phương pháp này trở nên ít hữu ích hơn
Ai đó ở đâu đó vào

11

Ví dụ cho tài nguyên hệ thống công cộng:

// this will get id for android.R.drawable.ic_dialog_alert
int id = Resources.getSystem().getIdentifier("ic_dialog_alert", "drawable", "android");

cảnh báo

Một cách khác là tham khảo tài liệu cho lớp android.R.drawable .


1
@Milaaaad ý bạn là gì?
naXa

nó có nghĩa là tôi bị nhầm lẫn bởi các tài nguyên trong mã và tôi sử dụng nó trong lớp không hoạt động
Milaaaad

1
@Milaaaad Phương pháp này dành cho tài nguyên hệ thống. Họ không phụ thuộc vào bối cảnh.
naXa

10

Bạn có thể sử dụng chức năng này để lấy ID tài nguyên:

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


Vì vậy, nếu bạn muốn lấy ID tài nguyên có thể vẽ , bạn có thể gọi phương thức như sau:

getResourseId(MyActivity.this, "myIcon", "drawable", getPackageName());

(hoặc từ một đoạn):

getResourseId(getActivity(), "myIcon", "drawable", getActivity().getPackageName());


Đối với ID tài nguyên chuỗi, bạn có thể gọi nó như thế này:

getResourseId(getActivity(), "myAppName", "string", getActivity().getPackageName());

Vân vân...


Cẩn thận : Nó ném RuntimeException nếu không tìm thấy ID tài nguyên. Hãy chắc chắn để phục hồi đúng trong sản xuất.

Đọc này


4
Tôi nghĩ rằng bạn cần phải loại bỏ statickhỏi đó, nếu không getResources()sẽ không hoạt động.
Richard Le Mesurier

@Richard Le Mesurier, bạn có thể giải thích tại sao không? Cảm ơn bạn.
Veer

1
@ Leo.Han Tại thời điểm tôi đưa ra nhận xét đó, Contextkhông có sẵn. Khắc phục là để loại bỏ staticvà di chuyển nó vào một Context(ví dụ Activityhoặc Application); hoặc sửa chữa thay thế là những gì Jonathan đã làm trong bản chỉnh sửa của mình, đó là truyền vào một Contextphương thức.
Richard Le Mesurier

1
@Richard Le Mesurier, tôi đã kiểm tra lịch sử chỉnh sửa ngay bây giờ, đúng như những gì bạn nói, cảm ơn bạn đã trả lời vui lòng sau nhiều năm :)
Veer

0

Một kịch bản khác mà tôi gặp phải.

Chuỗi imageName = "Hello" và sau đó khi nó được chuyển vào hàm getIdentifier làm đối số đầu tiên, nó sẽ chuyển tên với kết thúc chuỗi null và sẽ luôn trả về 0. Vượt qua imageName.sub chuỗi này (0, imageName.length () - 1)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.