Как проверить, существует ли ресурс в Android - PullRequest
50 голосов
/ 27 декабря 2010

Есть ли встроенный способ проверить, существует ли ресурс или я оставил что-то вроде следующего:

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

Ответы [ 4 ]

57 голосов
/ 27 декабря 2010

Согласно javadoc, вам не нужен try catch: http://developer.android.com/reference/android/content/res/Resources.html#getIdentifier%28java.lang.String,%20java.lang.String,%20java.lang.String%29

если getIdentifier() возвращает ноль, это означает, что такого ресурса не существует.
Также 0 - недопустимый идентификатор ресурса.

Таким образом, ваша логическая переменная результата эквивалентна (test != 0).

В любом случае, ваш try / finally плохой, потому что все, что он делает, устанавливает переменную результата в false, даже если исключение выбрасывается из тела try: mContext.get....., а затем просто «сбрасывает» исключение после выхода из finally. пункт. И я полагаю, что это не то, что вы хотите сделать в случае исключения.

26 голосов
/ 25 сентября 2013

Блок try / catch в вашем коде абсолютно бесполезен (и неверен), поскольку ни getResources(), ни getIdentifier(...) не выдают исключение.Итак, getIdentifier(...) уже вернет вам все, что вам нужно.Действительно, если он вернет 0, то ресурс, который вы ищете, не существует.В противном случае он вернет связанный идентификатор ресурса ( "0 не является действительным идентификатором ресурса" , действительно).

Здесь правильный код:

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

if ( checkExistence != 0 ) {  // the resource exists...
    result = true;
}
else {  // checkExistence == 0  // the resource does NOT exist!!
    result = false;
}
4 голосов
/ 17 октября 2016

Если кому-то интересно, "my_resource_name" в

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

на самом деле

String resourceName = String.valueOf(R.drawable.my_resource_name);
int checkExistence = mContext.getResources().getIdentifier(resourceName , "drawable", mContext.getPackageName());
2 голосов
/ 06 апреля 2018

Мне нравится делать что-то подобное:

public static boolean isResource(Context context, int resId){
        if (context != null){
            try {
                return context.getResources().getResourceName(resId) != null;
            } catch (Resources.NotFoundException ignore) {
            }
        }
        return false;
    }

, так что теперь это не только для рисования

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...