2010-12-27 42 views
41

Có được xây dựng theo cách để kiểm tra xem một nguồn tài nguyên tồn tại hay tôi trái làm một cái gì đó như sau:Làm thế nào để kiểm tra xem một nguồn tài nguyên tồn tại trong Android

boolean result; 
int test = mContext.getResources().getIdentifier("my_resource_name", "drawable", mContext.getPackageName()); 
result = test != 0; 
+0

Nó không có vẻ một cách rất khó để làm cái này. Điều gì làm phiền bạn trong phương pháp này? –

+0

Có lẽ không, nhưng tôi thích được xây dựng trong đó làm lỗi xử lý cho tôi, thay vì gắn bó thử/cuối cùng ở khắp mọi nơi. – user432209

+0

Bạn không cần xử lý lỗi ở đây. Đọc bình luận của tôi dưới đây. –

Trả lời

46

Theo javadoc bạn không cần thử bắt: http://developer.android.com/reference/android/content/res/Resources.html#getIdentifier%28java.lang.String,%20java.lang.String,%20java.lang.String%29

nếu getIdentifier() trả về không, điều đó có nghĩa là không có tài nguyên nào tồn tại.
Đồng thời 0 - là một id tài nguyên bất hợp pháp.

Vì vậy, biến boolean kết quả của bạn tương đương với (test != 0).

Dù sao thử/cuối cùng là xấu, bởi vì tất cả nó sẽ đặt biến kết quả thành false ngay cả khi ngoại lệ được ném ra khỏi phần thử: mContext.get..... và sau đó nó "rethrows" ngoại lệ sau khi thoát khỏi điều khoản cuối cùng . Và tôi cho rằng đó không phải là điều bạn muốn làm trong trường hợp ngoại lệ.

+3

Bạn có thể cung cấp một ví dụ được không? –

+0

Nếu tôi có "my_resource.png" và "my_resource.xml" thì sao? Làm thế nào tôi có thể phân biệt chúng giữa nhau? –

22

Khối try/catch trong mã của bạn hoàn toàn vô dụng (và sai), vì không phải getResouces() cũng không phải getIdentifier(...) ném ngoại lệ.

Vì vậy, getIdentifier(...) sẽ trả lại tất cả những gì bạn cần. Thật vậy, nếu nó sẽ trả về 0, thì tài nguyên bạn đang tìm kiếm không tồn tại. Nếu không, nó sẽ trả về mã định danh tài nguyên liên quan ("0 is not a valid resource ID", thực sự).

Đây mã đúng:

int checkExistence = mContext.getResources().getIdentifier("my_resource_name", "drawable", mContext.getPackageName()); 

if (checkExistence != 0) { // the resouce exists... 
    result = true; 
} 
else { // checkExistence == 0 // the resouce does NOT exist!! 
    result = false; 
} 
3

Trong trường hợp ai đó đang tự hỏi, các "my_resource_name" trong

int checkExistence = mContext.getResources().getIdentifier("my_resource_name", "drawable", mContext.getPackageName()); 

thực sự là

String resourceName = String.valueOf(R.drawable.my_resource_name); 
int checkExistence = mContext.getResources().getIdentifier(resourceName , "drawable", mContext.getPackageName()); 
Các vấn đề liên quan