2017-12-27 166 views
6

我能找到的最接近的现有问题是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没有附加到一个活动,但仍然 - 我如何解决不整洁的皮棉警告?

+2

“我该如何解决不整洁的皮棉警告?” - 压制它并继续前进。 – CommonsWare

+0

为什么你不使用getContext() –

+0

也许你可以依靠onActivityCreated或onAttach(depracated)这将给你有效的参考。然后用它代替getActivity()? – marcinj

回答

1

@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,并且在应用程序崩溃时可以正常运行。这就是为什么我说我宁愿有支持库代码。

相关问题