2016-06-10 202 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(); 
}