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

时间:2016-06-10 15:35:40

标签: android findviewbyid snackbar

我希望能够显示Snackbars,但我对此概念感到困惑,我必须为它提供View。您认为它默认允许您在屏幕底部显示Snackbar,但也许我错过了一些东西。

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

findViewById(android.R.id.content)

然而,我得到一个警告,即使它似乎总是在我尝试的任何地方都可以使用,但这可能是空的。什么时候可能是null?

2 个答案:

答案 0 :(得分:5)

如果您尝试查找当前布局中不存在的视图,则

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检查。

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

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

答案 1 :(得分: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();
}