NullPointerExeption con AppCompat BottomSheets

LinearLayout bottomSheetViewgroup = (LinearLayout) findViewById(R.id.bottomSheet); bottomSheetBehavior = BottomSheetBehavior.from(bottomSheetViewgroup); bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); //this line 

Tengo este código dentro del método onCreate () de mi actividad y estoy recibiendo la siguiente excepción de NPE cuando se ejecuta la última línea:

Causado por: java.lang.NullPointerException: Intenta invocar el método virtual 'java.lang.Object java.lang.ref.WeakReference.get ()' en una referencia de objeto nulo en android.support.design.widget.BottomSheetBehavior.setState BottomSheetBehavior.java:440)

Aunque la respuesta de Sanf0rds es correcta, no permite la capacidad de definir la BottomSheet como expandida por defecto. El problema es causado por la WeakReference que no se establece hasta la última línea de onLayoutChild.

La solución es proporcionar nuestra propia clase que extiende BottomSheetBehavior, pero estableciendo el estado dentro de un onLayoutChild sobreescrito. El código se proporciona a continuación.

Uk / ac / qub / quibe / misc / ExpandedBottomSheetBehavior.java

 package uk.ac.qub.quibe.misc; import android.content.Context; import android.support.design.widget.CoordinatorLayout; import android.util.AttributeSet; import android.view.View; /** * Created by mcp on 15/03/16. */ public class ExpandedBottomSheetBehavior<V extends View> extends android.support.design.widget.BottomSheetBehavior<V> { public ExpandedBottomSheetBehavior(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onLayoutChild(final CoordinatorLayout parent, final V child, final int layoutDirection) { SavedState dummySavedState = new SavedState(super.onSaveInstanceState(parent, child), STATE_EXPANDED); super.onRestoreInstanceState(parent, child, dummySavedState); return super.onLayoutChild(parent, child, layoutDirection); /* Unfortunately its not good enough to just call setState(STATE_EXPANDED); after super.onLayoutChild The reason is that an animation plays after calling setState. This can cause some graphical issues with other layouts Instead we need to use setInternalState, however this is a private method. The trick is to utilise onRestoreInstance to call setInternalState immediately and indirectly */ } } 

En la referencia del archivo de diseño, haga referencia a su nuevo comportamiento personalizado.

Cambio

 app:layout_behavior="android.support.design.widget.BottomSheetBehavior" 

A

 app:layout_behavior="uk.ac.qub.quibe.misc.ExpandedBottomSheetBehavior" 

He encontrado una solución, pero todavía no sé por qué sucede esto. La solución se pone esta última línea a llamada de usuario directamente después de que la actividad se está ejecutando. Ex: en un callback contextMenu o en cualquier OnClickListener.

El problema con su código es que está intentando llamar al método setState directamente dentro de onCreate. Esto es lanzará un nullPointer porque la WeakReference no se inicializa todavía. Se inicializará cuando el diseño del Coordinador esté a punto de establecer su vista de niño.

OnLayoutChild (CoordinatorLayout padre, V hijo, int layoutDirection)

Se llama cuando el padre CoordinatorLayout es acerca de la disposición de la vista secundaria determinada.

Así que el mejor enfoque se establece la altura de ojeada a 0 y mostrar / ocultar dentro del oyente onItemClick.

He respondido a esta pregunta aquí: https://stackoverflow.com/a/36236743/1314796

También puede considerar escuchar el evento de diseño global, de esta manera estará seguro de que la hoja de fondo se ha establecido al establecer el estado contraído.

 final View bottomSheet = findViewById(R.id.bottom_sheet); bottomSheet.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { bottomSheet.getViewTreeObserver().removeOnGlobalLayoutListener(this); bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet); bottomSheetBehavior.setPeekHeight(300); bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); } }); 
  • Utilice Picasso para colocar la imagen en dibujable
  • PreferenceActivity da una excepción NullPointerException cuando se selecciona de ListPreference
  • Android Reproducción de archivos de película en un fondo de pantalla en vivo
  • Androide. Fragmento getActivity () a veces devuelve null
  • Java.lang.NullPointerException en getapplicationContext () al iniciar el adaptador
  • Intenta invocar el método virtual 'int android.text.Layout.getLineCount ()' en una referencia de objeto nulo
  • NullPointerException en SearchView con ActionBarSherlock
  • NullPointerException en el método restartLoader de LoaderManager
  • Cómo rectificar NullPointerException en v4.DrawerLayout?
  • Android: App fallando cuando alcanza AlertDialog.Builder usando el método Post
  • - java.lang.NullPointerException - setText en la referencia de objeto nulo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.