DialogFragment getActivity ()" может быть null " Линт предупреждение в AndroidStudio 3.0.1
ближайший существующий вопрос, который я могу найти относительно этого, -Android Studio 3.0 Линт предупреждения для ссылок на активность, но это не помогает.
используя AndroidStudio 3.0.1, у меня есть DialogFragment
где я делаю это обычные вещи:
@Override
@NonNull
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
...
у меня есть ворс предупреждение стонет на меня, что Argument 'getActivity()' might be null
.
Я понимаю почему getActivity()
может быть null, и я понимаю, как проверка корпии знает это (из @Nullable
комментарий.)
мой вопрос: это все очень хорошо, и хорошо, что getActivity()
может быть null, но практически, как я должен справиться с этим изящно и аккуратно? onCreateDialog
должны возвратить Dialog
(из-за суперкласс' @Nullable
аннотация) так что я должны имейте контекст действия, чтобы создать его.
я мог бы предположить, что onCreateDialog
никогда не будет вызван, если DialogFragment
не привязан к действию, но все же-как мне обратиться к неопрятный ворс предупреждение?
3 ответов
ответ @Niklas объясняет, почему вы получаете это предупреждение сейчас. Я хотел бы поделиться своими мыслями о том, что вы должны на самом деле делать.
прежде всего, вся эта добавленная недействительность делает разоблачение старого дефицита дизайна, который присутствовал все эти годы - этот метод всегда может возвращать null (например, фрагмент отсоединен).
Я бы предпочел, чтобы они аннотировали возвращаемое значение как @NonNull и выбрасывали исключение внутренне, если этот метод вызывается, когда действие на самом деле null, но я понимаю, что это нарушит обратную совместимость и как таковую очень рискованно (хотя я вряд ли понимаю, почему кто-то называет этот метод, когда действие может быть фактически null).
Итак, что нам с этим делать?
прежде всего, поскольку функциональность не изменилась вообще, если код, о котором идет речь, уже работал, то сделайте то, что предложил @CommonsWare - либо подавите предупреждение, либо проигнорируйте его.
вы также можете обернуть каждый вызов в нуль проверьте, например, исключение.
что я собираюсь сделать, однако, это поместить этот метод в мой BaseDialog (который расширяется всеми другими диалогами):
protected FragmentActivity getActivityNonNull() {
if (super.getActivity() != null) {
return super.getActivity();
} else {
throw new RuntimeException("null returned from getActivity()");
}
}
обратите внимание, что все эти параметры эффективно заявляют, что вы действительно не ожидаете, что null будет возвращен и в порядке с App сбой, если это произойдет. Вот почему я сказал, что предпочел бы иметь это в коде библиотеки поддержки.
Edit:
в поддержку добавлен новый метод Фрагменты -requireActivity(). Этот метод эквивалентен getActivityNonNull()
описанный выше (хотя он бросает IllegalStateException
если не привязываться к деятельности).
используйте этот метод вместо getActivity()
и вы должны быть хорошо.
это дубликат - Android Studio 3.0 lint предупреждения для ссылок на активность.
tldr;getActivity()
получил с поддержкой lib 27.0.0 аннотацию @Nullable
и статические инструменты анализа поднимают это сейчас.
эти методы были добавлены в выпуске версии 27.1.0: фрагменты теперь имеют requireContext()
, requireActivity()
, requireHost()
и requireFragmentManager()
методы, которые возвращают объект NonNull эквивалентных методов get или вызывают исключение IllegalStateException.