对于 Snackbars,findViewById(android.R.id.content) 可以 return null 吗?

Can findViewById(android.R.id.content) ever return null for Snackbars?

我希望能够显示 Snackbar,但我对必须为其提供视图这一概念感到困惑。您可能认为它允许您默认在屏幕底部显示 Snackbar,但也许我遗漏了什么。

无论如何,这可以通过使用视图来完成:

findViewById(android.R.id.content)

然而,我收到一条警告,指出这可能为空,尽管无论我在哪里尝试它似乎总是有效。什么时候可能为空?

如果您不在 AppCompatActivity

中,请通过 activity
public static void snackBar(Activity activity, String MESSAGE) {
    Snackbar.make(activity.findViewById(android.R.id.content), MESSAGE, Snackbar.LENGTH_LONG).show();
}

如果你有上下文可以这样试

public static void snackBar(Context context, String MESSAGE) {
    Snackbar.make(((Activity)context).findViewById(android.R.id.content), MESSAGE, Snackbar.LENGTH_LONG).show();
}
如果您尝试查找当前布局中不存在的视图,

findViewById 始终可以为 null。

警告只是帮助。 它可能非常通用,如果你查看 Activity class 的源代码,你会发现这个方法:

@Nullable
public View findViewById(@IdRes int id) {
    return getWindow().findViewById(id);
}

Nullable 注释只是通知编译器可能会在此处获取 null 引用,Lint 将对此做出反应。它不知道如何区分 findViewById(android.R.id.content) 或其他带有 findViewById(R.id.myCustomLayoutId) 的调用。不过,您或许可以自己添加 Lint 检查。

只要您在 Activity 内,您就可以安全地使用 findViewById(android.R.id.content)

只要 onCreateView 被调用,您就可以在 Fragment 中安全地使用 getView()