DialogFragment getActivity() AndroidStudio 3.0.1 中的“可能是空的”lint 警告

2022-09-01 08:49:43

关于这一点,我能找到的最接近的现有问题是Android Studio 3.0 lint警告,用于引用活动,但这无济于事。

使用AndroidStudio 3.0.1,我有一个我做这个通常的东西的地方:DialogFragment

    @Override
    @NonNull
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        ...

我有一个棉绒警告对我呻吟。Argument 'getActivity()' might be null

我理解为什么可能是空的,我也理解lint检查如何知道这一点(从注释中)。getActivity()@Nullable

我的问题是:一切都很好,可能是空的,但实际上我应该如何优雅而整齐地处理这个问题呢? 必须返回一个(因为超类的注释),所以我必须有活动上下文来创建它。getActivity()onCreateDialogDialog@Nullable

我可以假设,如果不附加到活动,将永远不会被调用,但仍然 - 我如何解决不整洁的lint警告?onCreateDialogDialogFragment


答案 1

@Niklas的答案解释了为什么你现在会收到这个警告。我想分享我对你实际应该做什么的想法。

首先,所有这些增加的可空性所做的就是暴露了这些年来一直存在的旧设计缺陷 - 这种方法总是可以返回null(例如,Fragment分离)。

我更喜欢他们注释返回值为@NonNull并在内部抛出异常,如果当活动实际上为空时调用此方法,但我明白它会破坏向后兼容性,因此非常危险(尽管我几乎看不出为什么有人会调用此方法,而活动实际上可以是空的)。

那么,我们该怎么办呢?

首先,由于功能根本没有变化,如果有问题的代码已经工作,那么按照@CommonsWare建议的那样执行 - 要么抑制警告,要么忽略它。

您还可以将每个调用包装到空检查中,例如异常。

但是,我要做的是将此方法放在我的BaseDialog中(该对话框由所有其他对话框扩展):

protected FragmentActivity getActivityNonNull() {
    if (super.getActivity() != null) {
        return super.getActivity();
    } else {
        throw new RuntimeException("null returned from getActivity()");
    }
}

请注意,所有这些选项实际上都表明您并不真正期望返回null,如果发生这种情况,应用程序崩溃是可以的。这就是为什么我说我宁愿在支持库代码中使用它。

编辑:

添加了一个新方法来支持 Fragments - requireActivity()。。此方法等效于上面的 descried(尽管如果未附加到 Activity,则会引发此方法)。getActivityNonNull()IllegalStateException

使用这种方法而不是你应该很好。getActivity()


答案 2

这些方法在修订版 27.1.0 发行版中添加:片段现在具有 、 、 和方法,它们返回等效 get 方法的非空值对象或抛出 IllegalStateException。requireContext()requireActivity()requireHost()requireFragmentManager()


推荐