findViewById(android.R.id.content) 可以为 Snackbars 返回 null 吗?

Posted

技术标签:

【中文标题】findViewById(android.R.id.content) 可以为 Snackbars 返回 null 吗?【英文标题】:Can findViewById(android.R.id.content) ever return null for Snackbars? 【发布时间】:2016-10-11 15:34:12 【问题描述】:

我希望能够显示 Snackbars,但我对必须为其提供视图的想法感到困惑。您可能会认为默认情况下它允许您在屏幕底部显示 Snackbar,但也许我遗漏了一些东西。

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

findViewById(android.R.id.content)

但是我得到一个警告,这可能是空的,即使它似乎总是在我尝试它的地方工作。什么时候可能为空?

【问题讨论】:

你在 AppCompatActivity 中吗? 我通常在 AppCompatActivity 或 Fragment 中 对于 appCompatActivity 它可能与这个问题有关:code.google.com/p/android/issues/detail?id=203345 【参考方案1】:

如果您不在 AppCompatActivity 中,则通过活动

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();

【讨论】:

【参考方案2】:

findViewById 可以始终为 null,如果您尝试查找当前布局中不存在的视图。

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

@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()

【讨论】:

当您在 Fragment 中但希望 Snackbar 显示在整个屏幕的底部时会怎样? getActivity().findViewById(android.R.id.content) 什么的? 嗯,是的,您可以致电getActivity().findViewById(android.R.id.content) 获取根视图。 它还告诉我 getView() 可能为空——同样的想法?可能为空,但可能不是? getView()也被@Nullable注解,所以也可以返回null。如果您在调用 onViewCreated 之前调用它,它将返回 null。

以上是关于findViewById(android.R.id.content) 可以为 Snackbars 返回 null 吗?的主要内容,如果未能解决你的问题,请参考以下文章

android的ids是啥文件

android studio connot resolve

Android activity内实现可拖拽悬浮控件

Android activity内实现可拖拽悬浮控件

如何从 Activity RootView 中删除视图

循环遍历 GroupView 的所有子项?