Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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.

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

6 Solutions collect form web for “Android Snackbar NullPointerException en Fragmento”

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:

  1. Asegúrese de que su fragmento no se separa comprobando isDetached() primero.

  2. 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ó el findSuitableParent() en el constructor y agregó un cheque para verlo devuelve != null antes de intentar llamar a Snackbar.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:

  1. Asegúrese de que su actividad principal hereda de AppCompatActivity como sea necesario para usar las bibliotecas de soporte.
  2. 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.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.