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)
- ¿Qué es una NullPointerException y cómo puedo solucionarlo?
- Puntero nulo en ExpandedView para la búsqueda de ActionBar
- SwitchPreference (PreferenceAtivity) - Android NULL
- Android: NPE en TabSpec setContent (Ver)
- Posible motivo de "Error: no se pueden generar carpetas de vista java.lang.NullPointerException"
- Intenta invocar el método virtual 'void android.widget.Button.setOnClickListener (android.view.View $ OnClickListener)' en una referencia de objeto nulo
- getActivity (). findViewById (R.layout.contacts_list_view) devuelve null
- NullPointerException cuando el acceso a la matriz en la clase
- Expectativa de puntero nulo de Android en Textview setText
- RecyclerViewAdapter.notifyDataSetChanged () en una referencia de objeto nulo
- Expectativa de puntero nulo al obtener valores de preferencia compartida
- TimePicker NullPointerException en ICS
- ActionBar lanza NullPointerException
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); } });
- Imagen umbral con opencv (Java)
- ¿Cómo especifica la aplicación del proveedor de contenido los permisos que necesitan las aplicaciones de los clientes para acceder a los datos del proveedor?