- Support Annotations — аннотации для кода
- Аннотации для ресурсов
- @NONNULL/@NULLABLE
- @CheckResult — ожидание результата
- Аннотации для потоков
- Аннотация для цвета
- Диапазон значений
- Аннотации для разрешений
- Суперкласс
- Остальные аннотации
- Build Error: package android.support.annotation does not exist import android.support.annotation.Nullable #567
- Comments
- roshan-p commented Jun 19, 2019
- redcancode commented Jun 19, 2019
- roshan-p commented Jun 19, 2019 •
- duarte-evocorp commented Jun 20, 2019
- janicduplessis commented Jun 20, 2019
- tokinonagare commented Jun 20, 2019
- roshan-p commented Jun 20, 2019
- ronakjain-2 commented Jun 21, 2019 •
- rkbansal commented Jun 24, 2019
- praveens96 commented Jul 11, 2019
- NestedLooper commented Jul 16, 2019 •
- импорт NotNull или Nullable и Android Studio не будут компилироваться
- 7 ответов
- Каковы правильные применения @NonNull и @Nullable?
Support Annotations — аннотации для кода
Начиная с версии 19.1 библиотека Android support library включает себя аннотации, которые помогают улучшить код, уменьшая количество ошибок. Кстати, сама библиотека и многие другие классы системы уже используют новые аннотации в своём коде и вы их можете иногда видеть при наборе своего текста. Количество аннотаций увеличивается, поэтому сверяйтесь с документацией.
По умолчанию аннотации не включены, они идут как отдельная библиотека. Но она входит в состав библиотеки appcompat. Если вы не используете appcompat, то подключите библиотеку аннотаций самостоятельно.
Так как на сегодняшний день проекты по умолчанию используют appcompat, то будем считать, что аннотации всегда готовы к употреблению.
Подсказки с аннотацией появляются при попытке ввести неверный тип параметра в методе, который предусмотрительно снабжён аннотацией.
Аннотации для ресурсов
Для первого знакомства приведу пример с использованием ресурсов. В коде мы часто используем ресурсы строк, изображений, идентификаторов и т.п. По сути ресурс в данном случае является числом типа int. Подготовим ресурсы для имён котов в res/strings.xml
Напишем вспомогательный метод для генерации имени кота, используя строковый ресурс.
Студия не замечает ошибок, метод написан правильно и даже работает.
Но никто вам не помешает написать и такие варианты:
Два варианта используют корректные типы, но результат будет не тот, который мы хотели увидеть. В первом случае выведется путь к ресурсу (к счастью, программа продолжит работу), а во втором произойдёт ужасное — программа пойдёт к коту под хвост.
Как избежать этих ошибок, перепишем метод с добавлением аннотации:
Теперь студия будет подчёркивать неправильные параметры 451 или R.mipmap.ic_launcher и выводить предупреждение, что она ожидает строковые ресурсы, а не любые выдуманные вами числа.
Вы можете использовать аннотации @AnimatorRes, @AnimRes, @AnyRes, @ArrayRes, @AttrRes, @BoolRes, @ColorRes, @DimenRes, @DrawableRes, @FractionRes, @IdRes, @IntegerRes, @InterpolatorRes, @LayoutRes, @MenuRes, @PluralsRes, @RawRes, @StringRes, @StyleableRes, @StyleRes, @XmlRes и т.д. Если у вас есть свой тип ресурсов «foo», то можете использовать аннотацию FooRes.
@NONNULL/@NULLABLE
Поняв базовый принцип, вы теперь можете использовать и другие аннотации. Например, указать, что параметр не может быть null или, наоборот, может принимать значение null.
Студия выводит предупреждение, но позволит запустить программу. Нажатие на кнопку и опять ваш труд коту под хвост — крах приложения.
@CheckResult — ожидание результата
Метод может возвращать какое-то значение, которое нужно применить. А можно просто вызвать метод, только какой в этом смысл, если возвращаемое значение нигде не используется? Для тех, кто страдает склерозом — встречайте аннотацию @CheckResult.
Студия укажет на ошибку и откажется запускать ваше приложение. Умница.
Аннотация для продвинутых. ProGuard удаляет неиспользуемые методы при компиляции. Если она делает это ошибочно или по каким-то другим причинам вам нужно оставить метод в приложении, то используйте @Keep:
Аннотации для потоков
Существуют специальные аннотации для указания потоков.
Например, мы знаем, что методы класса AsyncTask могут работать только в определённых потоках.
Если в методе doInBackground() обратиться к какому-нибудь компоненту, то студия предупредит, что так делать нельзя.
@UiThread и @MainThread практически совпадают, но в редких случаях могут различаться. Подробности в документации.
Аннотация для цвета
Вы можете задать цвет через ресурс, используя аннотацию @ColorRes. А если перед вами стоит противоположная задача — указать значение цвета через RGB/ARGB, то используйте аннотацию @ColorInt. В этом случае при использовании цветового ресурса студия покажет ошибку.
Диапазон значений
Можно указать диапазон значений для типов float/double через аннотацию @FloatRange:
В этом случае можно использовать значения от 0.0 до 1.0. Любая попытка ввести другое значение приведёт к предупреждению.
Аналогично работает для типов int/long через аннотацию @IntRange:
Для массивов, коллекций и строк можно использовать аннотацию @Size для установки ограничений в размерах или длине строк.
- Если коллекция не должна быть пустой — @Size(min=1)
- Максимальная длина строки 15 символов — @Size(max=15)
- Массив точно состоит из двух элементов — @Size(2)
- Длина массива должна быть кратна двум (например, координаты точек X и Y) — @Size(multiple=2)
Аннотации для разрешений
Если ваш метод использует функциональность, которая доступна через разрешения, то можете указать через аннотацию @RequiresPermission:
Если имеются несколько подходящих разрешений, то можно использовать атрибут anyOf, чтобы выбрать один из них:
А если нужно выбрать несколько разрешений, то используйте атрибут allOf:
Разрешения для намерений
Если есть разрешения на чтение или запись, то можно указать нужный режим через аннотации @Read или @Write:
Суперкласс
Если метод должен использовать вызов суперкласса, то используем аннотацию @CallSuper:
Остальные аннотации
В документации вы можете узнать о других аннотациях: IntDef/StringDef, @VisibleForTesting и т.д.
Источник
Build Error: package android.support.annotation does not exist import android.support.annotation.Nullable #567
Comments
roshan-p commented Jun 19, 2019
I get this Erros after Android X migration, Please help
Package.json
«react-native»: «0.57.0»,
«react-native-fbsdk»: «^0.10.0»,
The text was updated successfully, but these errors were encountered:
redcancode commented Jun 19, 2019
this is a very interesting issue. i think it shouldn’t be happening. your error log mentions this file /node_modules/react-native-fbsdk/android/src/main/java/com/facebook/reactnative/androidsdk/FBLikeViewManager.java which doesn’t exist in 0.10.0, you can check it in the repo. are you sure you’ve pulled in the correct version of this library?
roshan-p commented Jun 19, 2019 •
@redcancode OK So I have tried delete node_modules re-install and build app again I still get the same errors but not with «FBLikeViewManager.java» anymore.
duarte-evocorp commented Jun 20, 2019
Has anyone been able to solve the problem?
janicduplessis commented Jun 20, 2019
Try version 1.0.0-rc.3 it should be compatible with androidx
tokinonagare commented Jun 20, 2019
try to use androidx
roshan-p commented Jun 20, 2019
Try version 1.0.0-rc.3 it should be compatible with androidx
Thanks It’s work! 🙂
ronakjain-2 commented Jun 21, 2019 •
Try version 1.0.0-rc.3 it should be compatible with androidx
can you please tell us. which module of 1.0.0-rc.3 version we need to use and where to use it either in build.gradle or in package.json.
I am also getting the same issue when doing change
Upgrade com.android.tools.build:gradle to v3.2.1.
Upgrade compileSdkVersion to 28.
Update your app to use Jetpack (AndroidX)
rkbansal commented Jun 24, 2019
@ronakjain-2 , it will be react-native-fbsdk
«react-native-fbsdk»: «1.0.0-rc.3»
praveens96 commented Jul 11, 2019
1.0.0-rc.3 solves this issue but receiving issue saying:
error: constructor FBSDKPackage in class FBSDKPackage cannot be applied to given types; new FBSDKPackage()
NestedLooper commented Jul 16, 2019 •
@praveens96 it needs to be
new FBSDKPackage(mCallbackManager)
If you have an additional new FBSDKPackage() without the callback manager being passed then remove it.
Источник
импорт NotNull или Nullable и Android Studio не будут компилироваться
когда я добавляю @NotNull или @ nullable аннотации к параметру Android Studio автоматически помогает мне с добавлением/lib / аннотаций.jar и импорта
но после этого проект не компилируется. Если я также удалю аннотации, но сохраню операторы импорта, проект все равно не будет компилироваться. но если я удаляю операторы импорта для NotNull и Nullable, проект компилируется штраф в размере!
Android Studio дает общий ошибка:
под управлением gradlew compileDebug из cmd дает небольшой намек:
поэтому я проверил переменные среды, и они установлены как:
у кого-нибудь есть идеи для этого? (Я новичок в программировании на java и android)
7 ответов
Я думаю, правильный способ-использовать оригинальную библиотеку JetBrains из репозитория MavenCentral в вашей сборке.зависимости gradle (последняя доступная версия в этом примере):
вы также можете использовать собственный android @NonNull & @Nullable :
добавить построить.Gradle в:
на / задание → Настройки Проекта → инспекции и поиск «nullable».
на постоянные условия и исключения и @NotNull / @Nullable проблемы, нажмите кнопку настроить Примечания и выберите аннотации Android.
вы также можете проверить предложить @ nullable аннотации. под постоянные условия и исключения, или, возможно, настроить другие параметры.
для использования анотации поддержки андроида как — @Nullable, @NonNull etc.. В ваш проект необходимо импортировать библиотеку аннотаций поддержки android. Просто добавьте эту строку в dependensies в файле gradle
и импортировать пакет в класс.
для использования @nullable аннотация:
больше информации вы можете найти здесь разработчики Android
на данный момент в API Android или в библиотеке поддержки нет аннотаций NonNull/Nullable. Вы также не можете использовать IntelliJ, так как они не находятся в пути к классам компиляции при построении с помощью Gradle.
тем не менее, вы можете легко создать свой собственный. Это очень просто:
после этого вы можете настроить IntelliJ (или Android Studio), чтобы распознать этот (и соответствующий @Nullable ) быть аннотацией по умолчанию, используемой для Нулевые проверки.
для этого перейдите в настройки IntelliJ в разделе Inpections , а затем найти @NotNull/@Nullable problems вход под Probable Bugs в дереве инспекции.
выберите пункт и в правом нижнем углу у вас будет кнопка «настроить аннотации». Это позволит вам установить свои собственные аннотации в качестве одного intelliJ будет использовать для этой проверки.
самый простой способ добавить следующее в раздел зависимостей вашей сборки.файл gradle.
EDIT: обновлено для использования идеи @RichieHH для использования репозитория maven, что, безусловно, является способом сделать это.
в настоящее время, вы должны использовать аннотации android.поддержка.аннотация. Я просто не уверен, когда они добавили их в docs нет типичного предложения «добавлено на уровне API X», и мне не хочется читать блоги и т. д. >]
лучший способ-использовать зависимость maven
Источник
Каковы правильные применения @NonNull и @Nullable?
Я запутался в правильном использовании этих аннотаций.
Информация в документации для @NonNull говорит:
Обозначает, что возвращаемое значение параметра, поля или метода никогда не может быть нулевым.
Что это означает в случае параметров, когда нет ничего, чтобы остановить передачу null ?
Например, предположим, что у меня есть класс MyObject и что экземпляр может иметь или не иметь заголовок.
Здесь я использую null для представления отсутствия заголовка, но это детализация реализации, поэтому мне не нужен ни один метод установки и очистки заголовка.
Если я @Nullable title поля как @Nullable , студия Android сообщает мне, что параметр setTitle должен быть также отмечен как @Nullable (но это противоположность тому, что я хочу).
Если я setTitle методу setTitle как @NonNull я получаю предупреждение о том, что title == null состояния title == null всегда является false .
Какое правильное использование этих аннотаций в таком случае? Если @NonNull означает, что параметр никогда не может быть null неправильно ли использовать его для обозначения не должно быть null ? Если да, есть ли правильный способ указать это?
Дело в том, что эта аннотация – это своего рода контракт, поэтому вам не нужно делать проверки, если вы правильно аннулируете свои методы. Android Studio проверяет, что вы не с этим связываетесь. Вы все равно можете игнорировать его, но это приведет к предупреждению компилятора.
Если вы опустите эту бесполезную (по контракту) проверку безопасности, она будет правильно перебрасывать nullpointer-excceptions. Но разработчик был предупрежден с вашей аннотацией.
@Nonnull и @Nullable являются декларативными. Это подсказка для разработчиков программного обеспечения. Вы говорите им, что параметр может быть нулевым значением, или он не должен.
Если вы отметите параметр аннотацией @Nonnull , вы сообщите каждому человеку, использующему ваш API, что они не должны передавать здесь нулевое значение, иначе они должны иметь дело с последствиями (например, NullPointerException ).
Вы можете использовать его для объявления, параметр ДОЛЖЕН быть недействительным, это, по-моему, действительный прецедент.
Идем дальше и помечаем параметр методу @NonNull как @NonNull .
Это гарантирует, что компилятор выдает ошибку, когда какой-то код вызывает setTitle со значением, которое может быть нулевым . Поэтому компилятор гарантирует, что setTitle никогда не вызывается с null . Поэтому вы можете удалить null проверку в вашем методе, в результате чего заголовок «title == null всегда остается ложным».
Т.е. ваш код будет выглядеть так:
(Примечание: я не использую Android Studio, но я думаю, что он ведет себя аналогично Eclipse. В Eclipse я получаю ошибку Null type mismatch: required ‘@NonNull String’ but the provided value is null(/inferred as @Nullable) при попытке Передать null или выражения, которые могут иметь значение null для setTitle.)
BTW: также аннотирование определения title поля с помощью @Nullable сделает его более явным title также может содержать null значения.
Если вы помечаете аргумент @NonNull, то пользователь вашего метода должен выполнить нулевую проверку, так как @NonNull не будет захватывать NPE во время выполнения. Так, например, если у вас был класс утилиты со вспомогательными методами, которые проверяют значение null перед выполнением, то вы должны пометить эти аргументы как @Nullable, так как вы технически можете передать нулевое значение, но безопасно проверяете его.
Источник