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

我能找到的最接近的现有问题是Android Studio 3.0 lint warnings for references to activity,但它没有帮助。DialogFragment getActivity()“可能为空”AndroidStudio 3.0.1中的lint警告

使用AndroidStudio 3.0.1,我有一个DialogFragment,我这样做平常的东西:

@Override 

@NonNull

public Dialog onCreateDialog(Bundle savedInstanceState) {

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

...

我在我有一个lint警告的呻吟是Argument 'getActivity()' might be null

我明白为什么getActivity()可能是空的,我明白了皮棉检验如何知道这(从@Nullable注释)。

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

我可以认为onCreateDialog永远不会被调用,如果DialogFragment没有附加到一个活动,但仍然 - 我如何解决不整洁的皮棉警告?

回答:

这是 - Android Studio 3.0 lint warnings for references to activity的副本。

tldr; getActivity()用Support lib 27.0.0注释@Nullable和静态分析工具现在挑选。

回答:

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

首先,所有这些添加的可空性确实暴露了这些年来一直存在的旧设计缺陷 - 这种方法总是可以返回空值(例如碎片分离)。

我宁愿他们注释返回值为@NonNull并在内部抛出异常,如果这个方法在Activity实际为空时被调用,但我知道它会破坏向后兼容性,因此非常危险(尽管我可以几乎看不出为什么任何人在Activity实际上可以为null时调用此方法)。

那么,我们应该怎么做呢?

首先,由于功能完全没有改变,如果有问题的代码已经工作,然后做@CommonsWare建议 - 要么禁止警告或忽略它。

您也可以将每个电话打包为空检查,例如,例外。

什么,我要做的事情,但是,把这种方法在我BaseDialog(这是由所有其他对话扩展):

protected FragmentActivity getActivityNonNull() { 

if (super.getActivity() != null) {

return super.getActivity();

} else {

throw new RuntimeException("null returned from getActivity()");

}

}

注意,所有这些选项有效状态,你不要”如果发生这种情况,我们真的希望返回null,并且在应用程序崩溃时可以正常运行。这就是为什么我说我宁愿有支持库代码。

以上是 DialogFragment getActivity()“可能为空”AndroidStudio 3.0.1中的lint警告 的全部内容, 来源链接: utcz.com/qa/266131.html

回到顶部