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.