可以找到ViewById(android.R.id.content)永远为Snackbars返回null



我希望能够显示小吃栏,但我对这个概念感到困惑,我必须为它提供一个视图。您会认为默认情况下它会允许您在屏幕底部显示小吃栏,但也许我错过了一些东西。

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

findViewById(android.R.id.content)

但是,我收到警告说这可能是空的,即使无论我尝试在哪里,它似乎总是有效。什么时候可能为空?

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

如果您不在 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();
}

最新更新