是否建议在每次 findViewById 调用时检查视图是否为空?

Posted

技术标签:

【中文标题】是否建议在每次 findViewById 调用时检查视图是否为空?【英文标题】:Is it recommended to check view for null with every findViewById call? 【发布时间】:2014-06-27 11:10:55 【问题描述】:

当使用findViewById 膨胀元素时,android Studio 总是警告我我的膨胀视图可能返回 null

View v = inflater.inflate(R.layout.fragment_photo_gallery, container, false);

并建议我用 null 检查围绕我的语句:

if (v != null) 
    mGridView = (GridView)v.findViewById(R.id.gridView);

是否建议在膨胀元素之前始终进行上述的空检查?

编辑:添加 lint 图片

【问题讨论】:

【参考方案1】:

我认为你永远不应该那样做。

如果您这样做,您将掩盖程序中的逻辑错误,以防您将错误的 id 传递给您的 findView。

如果你传递了一个正确的 id 但由于任何原因 inflater 返回 null 那是 Android 问题(这永远不会发生),你也不应该做任何事情。

我认为此警告并非来自 Android Lint。

【讨论】:

添加了显示我在 Android Studio 中收到的 lint 警告的图像。【参考方案2】:

如果您确定要传递的 id 确实存在于应用程序上下文中,则可以忽略此警告并继续执行您的代码查看因为

     View v = inflater.inflate(R.layout.fragment_photo_gallery, container, false);

如果 "R.layout.fragment_photo_gallery" 不正确或将 v 渲染为 null 无效,将返回 null。

于是就有了这样的尝试

     mGridView = (GridView)v.findViewById(R.id.gridView);

可能导致空指针异常

【讨论】:

以上是关于是否建议在每次 findViewById 调用时检查视图是否为空?的主要内容,如果未能解决你的问题,请参考以下文章

如何在一个imageview中为每次点击调用不同的可绘制动画?

Android通过泛型简化findViewById类型转换

在 setContentView() 之前调用 findViewById() 会导致 NullPointerException 但并非总是如此? [复制]

NullPointerException:尝试在空对象引用上调用虚拟方法 findViewById(int)'

appium findelementsbyid怎么定位不到元素的

空指针异常 - findViewById()