2016-06-10 2 views
0

Je veux être capable d'afficher Snackbars mais je suis confus par cette notion que je dois lui fournir une vue. Vous penseriez que cela vous permettrait d'afficher le Snackbar en bas de l'écran par défaut, mais peut-être qu'il me manque quelque chose.Est-ce que findViewById (android.R.id.content) peut retourner null pour Snackbars?

Quoi qu'il en soit soi-disant cela peut être fait en utilisant la vue:

findViewById(android.R.id.content)

Cependant, je reçois un avertissement que cela peut être nul, même si elle semble toujours travailler partout où je l'essayer. Quand peut-il être nul?

+0

Êtes-vous dans un AppCompatActivity? – Chol

+0

Je suis généralement soit dans un AppCompatActivity ou un fragment –

+0

Pour appCompatActivity, il peut être lié à ce problème: https://code.google.com/p/android/issues/detail?id=203345 – Chol

Répondre

3

findViewById peut toujours être nul, si vous essayez de trouver une vue qui n'existe pas dans la présentation actuelle.

L'avertissement est juste une aide. Il est probablement très générique et si vous regardez à l'intérieur de la source de la classe Activity, vous trouverez cette méthode:

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

L'annotation Nullable informe simplement le compilateur qu'il pourrait y avoir une possibilité d'obtenir une référence null ici et La charpie réagira à cela. Il ne sait pas comment faire la différence entre un findViewById(android.R.id.content) ou un autre appel avec findViewById(R.id.myCustomLayoutId). Vous pourriez probablement ajouter le contrôle de la peluche vous-même cependant.

Vous pouvez utiliser en toute sécurité findViewById(android.R.id.content) lorsque vous êtes à l'intérieur d'un Activity.

Vous pouvez utiliser en toute sécurité getView() à l'intérieur d'un Fragment chaque fois que onCreateView a été appelée.

+0

Qu'en est-il lorsque vous ' Re à l'intérieur d'un fragment, mais vous voulez que le Snackbar s'affiche en bas de l'écran? getActivity(). findViewById (android.R.id.content) ou quelque chose? –

+0

Ah oui, vous pouvez appeler 'getActivity(). FindViewById (android.R.id.content)' pour obtenir la vue racine. – Darwind

+0

Cela me dit aussi que getView() pourrait être nul - même idée? Peut-être nul mais probablement pas? –

0

passer l'activité si vous n'êtes pas dans AppCompatActivity

public static void snackBar(Activity activity, String MESSAGE) { 
    Snackbar.make(activity.findViewById(android.R.id.content), MESSAGE, Snackbar.LENGTH_LONG).show(); 
} 

Si vous avez un contexte, vous pouvez essayer comme ça

public static void snackBar(Context context, String MESSAGE) { 
    Snackbar.make(((Activity)context).findViewById(android.R.id.content), MESSAGE, Snackbar.LENGTH_LONG).show(); 
}