Android Snackbar NullPointerException en Fragmento
Quiero añadir un snackbar básico a mi aplicación pero he recibido un error que no pude averiguar por qué.
He añadido este código en el método onCreateView () en mi fragmento.
- Android Snackbar se oculta detrás de la interfaz de usuario del sistema
- SnackBar aparecen animación
- En una acción de snackbar, ¿cómo puedo asegurarme de que es seguro borrar de forma permanente un registro borrado por software de la base de datos?
- Envolver la altura del contenido en un SnackBar
- Android SnackBar: error al inflar SnackbarLayout
Snackbar.make(view, "Snackbar", Snackbar.LENGTH_LONG) .setAction("Action", null).show();
Y recibió este error:
06-01 10:26:09.955 1232-1232/? E/ActivityThread﹕ Failed to find provider info for me.muraterdogan.watchme.MetricaContentProvider 06-01 10:26:10.075 1232-1447/? E/ActivityThread﹕ Failed to find provider info for me.muraterdogan.watchme.YPLContentProvider 06-01 10:33:55.044 6646-6646/? E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: me.muraterdogan.watchme, PID: 6646 java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.view.ViewGroup.getContext()' on a null object reference at android.support.design.widget.Snackbar.<init>(Snackbar.java:116) at android.support.design.widget.Snackbar.make(Snackbar.java:140) at me.muraterdogan.watchme.fragments.TrendingFragment.GetData(TrendingFragment.java:90) at me.muraterdogan.watchme.fragments.TrendingFragment.onCreateView(TrendingFragment.java:83) ...
- Cómo configurar el color de texto de la barra de ayuda de la biblioteca de soporte a algo que no sea android: textColor?
- ¿Cómo puedo ser notificado cuando una Snackbar se ha despedido?
- Biblioteca de soporte de Android Snackbar con longitud indefinida
- ¿Cómo puedo cambiar la alineación inicial de Android Snackbar de abajo hacia arriba?
- ¿Podemos realizar 2 acciones diferentes en Snack bar al mismo tiempo en android?
- ¿Es una buena práctica incluir todos los diseños en CoordinatorLayout?
- Cómo deshabilitar el comportamiento de "snack-to-dismiss"
- Haz que Snackbar empuje la vista hacia arriba
Si su Fragmento se agrega a la actividad existente (recuerde que puede agregar a través de xml), debe llamar al método SnackBar en el método onActivityCreated () del fragmento.
@Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Snackbar.make(view, "Snackbar", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); }
1.Movielo al método onActivityCreated.
2.try para utilizar getView () en hacer como:
Snackbar.make(getView(), "Snackbar", Snackbar.LENGTH_LONG) .setAction("Action", null).show();
En una base de código que estaba trabajando, había Snackbar
s mostrado en callbacks de método asíncrono, como los manejadores de errores de una llamada de red. Cuando se estaba haciendo la Snackbar
, el Fragment
que iba a ir ya no estaba conectado y su View
como devuelta por getView()
no tenía un CoordinatorLayout
o FrameLayout
Snackbar
quiere tener en la jerarquía de la vista.
En particular, es el método findSuitableParent()
privado en Snackbar
que atraviesa la jerarquía:
private static ViewGroup findSuitableParent(View view) { ViewGroup fallback = null; do { if (view instanceof CoordinatorLayout) { // We've found a CoordinatorLayout, use it return (ViewGroup) view; } else if (view instanceof FrameLayout) { if (view.getId() == android.R.id.content) { // If we've hit the decor content view, then we didn't find a CoL in the // hierarchy, so use it. return (ViewGroup) view; } else { // It's not the content view but we'll use it as our fallback fallback = (ViewGroup) view; } } if (view != null) { // Else, we will loop and crawl up the view hierarchy and try to find a parent final ViewParent parent = view.getParent(); view = parent instanceof View ? (View) parent : null; } } while (view != null); // If we reach here then we didn't find a CoL or a suitable content view so we'll fallback return fallback; }
El resultado de este método se pasa al constructor Snackbar
que llama a getContext()
en él, y si este método devuelve null
obtendrá el NPE como se ve en la pregunta.
Hay un par de maneras de arreglar el problema, asumiendo el caso feliz de tener un CoordinatorLayout
o FrameLayout
en fragmentos adjuntos todavía tiene:
-
Asegúrese de que su fragmento no se separa comprobando
isDetached()
primero. -
Lo que terminé haciendo yo mismo: Ya había un diseño de estilo Builder wrapper para la
Snackbar
en la base de código, así que bifurcó elfindSuitableParent()
en el constructor y agregó un cheque para verlo devuelve!= null
antes de intentar llamar aSnackbar.make()
. De esta manera, los llamadores del constructor de Snackbar no tuvieron que agregar ninguna comprobación adicional.
Por proceso, la barra de bocadillos busca la vista.
- Has utilizado la vista fragmentos
- Pero el punto de vista del fragmento en sí no está todavía unido, ya que en el atajo del fragmento todavía no se llama.
Por lo tanto, la aplicación en sí no sabe realmente, en tiempo de ejecución, que se estaba refiriendo a la vista del fragmento.
Trate de colocar su método de presentación de snackbar en el "onResume" del fragmento. Espero que esto ayude.
¿Por qué estás haciendo esto dentro de Creer?
Además asegúrese de que está siguiendo un par de reglas:
- Asegúrese de que su actividad principal hereda de AppCompatActivity como sea necesario para usar las bibliotecas de soporte.
- Asegúrese de que la vista que está pasando realmente existe (es por eso que estoy preguntando por qué está haciendo esto en onCreate y por qué no después?)
Como dice la documentación "Snackbar intentará encontrar una vista padre para mantener la vista de Snackbar desde el valor dado a la vista".
Así que usted puede pasar cualquier vista que se adjunta en este momento.