2016-06-10 203 views
0

我希望能够显示Snackbars,但我很困惑这个概念,我必须提供一个视图。你会认为它会允许你默认在屏幕底部显示Snackbar,但也许我错过了一些东西。可以findViewById(android.R.id.content)为Snackbars返回null?

反正据说这可以通过使用视图来完成:

findViewById(android.R.id.content)

不过,我得到一个警告,这可能为空,即使它似乎总是工作,无论我试试吧。它何时可能为空?

+0

您是否在AppCompatActivity? – Chol

+0

我通常在AppCompatActivity或片段 –

+0

对于appCompatActivity它可能与此问题有关:https://code.google.com/p/android/issues/detail?id=203345 – Chol

回答

3

findViewById总是可以为空,如果你试图找到一种观点认为,在当前布局中不存在。

该警告只是一个帮助。 这也可能是非常通用的,如果你看看Activity类的源里面,你会发现这个方法:

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

Nullable注释只是告知编译器,有可能会在这里得到一个null参考的可能性,林特会对此作出反应。它不知道如何区分findViewById(android.R.id.content)或其他呼叫与findViewById(R.id.myCustomLayoutId)。不过你可以自己添加Lint检查。

无论何时在Activity的内部,您都可以安全地使用findViewById(android.R.id.content)

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

+0

当你“重新放入片段内,但是您希望小吃店显示在整个屏幕的底部? getActivity()。findViewById(android.R.id.content)什么的? –

+0

啊是的,你可以调用'getActivity()。findViewById(android.R.id.content)'来获得根视图。 – Darwind

+0

它也告诉我getView()可能为空 - 相同的想法?可能为空,但可能不是? –

0

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