Подтвердить что ты не робот

Android - ожидаемый ресурс идентификатора типа

У меня есть этот код

final static int TITLE_ID = 1;
final static int REVIEW_ID = 2;

Теперь я хочу создать новый макет в моем основном классе

public View createContent() {
    // create linear layout for the entire view
    LinearLayout layout = new LinearLayout(this);
    layout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT));
    layout.setOrientation(LinearLayout.VERTICAL);

    // create TextView for the title
    TextView titleView = new TextView(this);
    titleView.setId(TITLE_ID);
    titleView.setTextColor(Color.GRAY);
    layout.addView(titleView);

    StarView sv = new StarView(this);
    sv.setId(REVIEW_ID);
    layout.addView(sv);

    return layout;
}

Но когда я называю TITLE_ID и REVIEW_ID, это дает мне ошибку

Поставка неверного идентификатора ресурса.
Например, при вызове Resource.getString(int id) вы должны передать R.string.something, а не R.drawable.something.
Передача неправильной константы методу, который ожидает один из определенного набора констант. Например, при вызове View # setLayoutDirection параметр должен быть android.view.View.LAYOUT_DIRECTION_LTR или android.view.View.LAYOUT_DIRECTION_RTL.

У меня нет проблем с запуском этого кода. Мне просто интересно, почему это дает мне ошибку. Любая идея?

4b9b3361

Ответ 1

Это не ошибка компилятора. Это просто ошибка проверки редактора (предупреждение lint), поскольку это не обычный способ справиться с идентификаторами.

Итак, если ваше приложение поддерживает API 17 и выше,

вы можете вызвать View.generateViewId как

  titleView.setId(View.generateViewId());

и

  sv.setId(View.generateViewId());

и для API < 17

  • откройте папку проекта res/values/
  • создайте xml файл с именем ids.xml

со следующим содержимым:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="titleId" type="id" />
    <item name="svId" type="id" />
</resources>

то в вашем коде

  titleView.setId(R.id.titleId);

и

  sv.setId(R.id.svId);

И отключить это предупреждение (если хотите)

В Android Studio нажмите на лампочку на линии с этой "ошибкой". И выберите Отключить проверку в первом подменю.

Ответ 2

Вы также можете отключить lint в файле build.gradle. Добавьте эти строки в файл build.gradle.

android { 
       lintOptions{
             disable "ResourceType"
       }
}

Ответ 3

Я включаю это как альтернативу "исправлению" проблемы для тех, кто не может сгенерировать идентификатор вида (т.е. определить идентификатор до фактического представления) и знать, что они делают.

Непосредственно над объявлением переменной или методом, содержащим эту проблему, просто включите @SuppressWarnings("ISSUE_IDENTIFIER"), чтобы отключить предупреждение lint для этого экземпляра.

В этом случае это будет @SuppressWarnings("ResourceType")

Использование общих методов для отключения типа предупреждения плохой практики и может привести к непредвиденным проблемам, таким как утечка памяти и нестабильный код. Не публикуйте мусор.

Обязательно отмените настройку Disable inspection и удалите эти строки из файла build.gradle:

android {
    lintOptions{
        disable "ResourceType"
    }
}