Null Pointer Exception on child en onMeasure (): futuresimple / floating-action-button

Botón de acción flotante de Android Lib

Creé el menú de la acción flotante en el archivo del xml y creando el botón dinámico de la acción flotante debajo de este menú flotante de la acción. Estoy fijando el mapa de imagen en cada FAB. En alguna condición en particular, tengo que eliminar todos los botones en el menú de acción flotante. Pero en el removeView() de removeView() , estoy consiguiendo la Null Pointer Exception en el objeto del niño, cuando está intentando conseguir visibilidad del niño en el método de onMeasure() . Debajo está el rastro de la pila y mi código.

 java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getVisibility()' on a null object reference at com.getbase.floatingactionbutton.FloatingActionsMenu.onMeasure(FloatingActionsMenu.java:224) at android.view.View.measure(View.java:17565) at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1263) at android.widget.FrameLayout.onMeasure(FrameLayout.java:436) at android.widget.ScrollView.onMeasure(ScrollView.java:337) at android.view.View.measure(View.java:17565) at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727) at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463) at android.view.View.measure(View.java:17565) at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:940) at android.view.View.measure(View.java:17565) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537) at android.widget.FrameLayout.onMeasure(FrameLayout.java:436) at android.view.View.measure(View.java:17565) at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727) at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463) at android.view.View.measure(View.java:17565) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) at android.widget.LinearLayout.measureVertical(LinearLayout.java:722) at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) at android.view.View.measure(View.java:17565) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537) at android.widget.FrameLayout.onMeasure(FrameLayout.java:436) at android.support.v7.internal.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:124) at android.view.View.measure(View.java:17565) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) at android.widget.LinearLayout.measureVertical(LinearLayout.java:722) at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) at android.view.View.measure(View.java:17565) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537) at android.widget.FrameLayout.onMeasure(FrameLayout.java:436) at android.view.View.measure(View.java:17565) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) at android.widget.LinearLayout.measureVertical(LinearLayout.java:722) at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) at android.view.View.measure(View.java:17565) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537) at android.widget.FrameLayout.onMeasure(FrameLayout.java:436) at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2615) at android.view.View.measure(View.java:17565) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2045) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1196) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1409) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1084) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5990) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) at android.view.Choreographer.doCallbacks(Choreographer.java:580) at android.view.Choreographer.doFrame(Choreographer.java:550) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) at android.os.Handler.handleCallback(Handler.java:746) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5343) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(Z 

Código para agregar dinámicamente un botón de acción de flotante que se quita:

  @Override public void onTap() { if (menuMultipleActions != null) { for (int i = 1; i <= mSelectedImages.size(); i++) { System.out.println("i value ==> " + i); menuMultipleActions.removeView(menuMultipleActions.getChildAt(i)); } } mSelectedImages.clear(); } @Override public void onPictureTaken(String filePath) { mSelectedImages.add(filePath); menuMultipleActions = (FloatingActionsMenu) findViewById(R.id.multiple_action); Snackbar.make(this.findViewById(android.R.id.content), "size = " + mSelectedImages.size(), Snackbar.LENGTH_SHORT).show(); if (mSelectedImages.size() > 0) { for (int num = 0; num < mSelectedImages.size(); num++) { floatingActionButton = new com.getbase.floatingactionbutton.FloatingActionButton(getBaseContext()); floatingActionButton.setSize(com.getbase.floatingactionbutton.FloatingActionButton.SIZE_MINI); floatingActionButton.setImageBitmap(getImageFromPath(mSelectedImages.get(num))); floatingActionButton.setId(num); menuMultipleActions.addButton(floatingActionButton); } } } 

Intente usar el menuMultipleActions.removeButton() lugar del método removeView() . Internamente, el removeButton manipula algunos indicadores.

FloatingActionButton.java

Hay dos problemas con el código dado. En primer lugar, como Viswanath señala arriba usando removeView () como sigue siempre se bloquea (independientemente del bucle)

 menuMultipleActions.removeView(menuMultipleActions.getChildAt(0)); 

El segundo problema es que el bucle siempre se bloqueará en parte porque, al eliminar cada botón, el número de vistas en menuMultipleActions disminuye en uno. La solución a esto sería hacer un bucle hacia atrás, o borrar siempre el zeroth, por ejemplo

 if (menuMultipleActions != null) { for (int i = 0; i < mSelectedImages.size(); i++) { System.out.println("i value ==> " + i); menuMultipleActions.removeButton((FloatingActionButton) menuMultipleActions.getChildAt(0)); } } 

Aunque podría estar más inclinado a usar menuMultipleActions.getChildCount () como una forma más segura de encontrar el número de botones.

La solución más general, que funcionará en un bucle o para eliminar cualquier botón único por id sería utilizar findViewById para encontrar el botón antes de eliminarlo. p.ej

 FloatingActionButton fab = (FloatingActionButton) menuMultipleActions.findViewById(ButtonId); if (fab != null) menuMultipleActions.removeButton(fab); 

Si se establece una etiqueta para el FloatingActionButton también puede utilizar findViewByTag porque la implementación utiliza la etiqueta como la etiqueta.

  • Excepción de puntero nulo en .setOnClickListener
  • La ejecución de Instrumentation falló debido a 'java.lang.NullPointerException'
  • NullPointerException en android.content.ContextWrapper
  • java.lang.NullPointerException: Intenta invocar método de interfaz en un error de referencia de objeto nulo en OnPostExecute () - AsyncTask
  • Android TabHost.addTab -> Excepción de puntero nulo
  • FindViewById devuelve null en un LinearLayout dentro de una vista <include> d
  • ¿Por qué el servicio Android falla con NullPointerException?
  • Touch Calculator en Android
  • Aplicaciones se bloquea después de la ofuscación con ProGuard
  • FindFragmentById devolver null
  • Excepción Java del puntero nulo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.