2015-10-17 16 views
7

Android Floating Action Button Lib UsedNull Pointer Exception il bambino in onMeasure(): futuresimple/floating-azione-tasto

ho creato Azione Menu galleggiante in xml di file e la creazione di pulsante Azione Floating dinamica ai sensi della presente Floating menu Azione. Sto impostando un'immagine bitmap su ogni FAB. In alcune condizioni particolari, devo rimuovere tutti i pulsanti in Floating Action Menu. Ma con il metodo removeView(), sto ricevendo Null Pointer Exception sull'oggetto figlio, quando sta tentando di ottenere la visibilità del figlio nel metodo onMeasure(). Di seguito è riportato lo stack trace e il mio codice.

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 

codice per aggiungere dinamicamente un pulsante di azione Floating rimozione:

 @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); 
      } 
     } 
    } 
+0

Potrebbe pubblicare il metodo suMisura(). linea insluding FloatingActionsMenu.java:224? –

+0

https://github.com/futuresimple/android-floating-action-button/blob/master/library/src/main/java/com/getbase/floatingactionbutton/FloatingActionsMenu.java –

+0

Puoi provare a utilizzare menuMultipleActions.removeButton() invece di removeView? Perchè manipola internamente alcuni flag nel metodo per il suo figlio. –

risposta

3

Provate ad usare menuMultipleActions.removeButton() invece di removeView() metodo. Internamente il removeButton manipola alcune bandiere.

FloatingActionButton.java

+0

'if (menuMultipleActions! = Null) { per (int i = 0; i <= mSelectedImages.size(); i ++) { System.out.println (" valore i ==> "+ i); menuMultipleActions.removeButton ((FloatingActionButton) menuMultipleActions.getChildAt (i)); } } ' –

2

Ci sono due problemi con il codice dato. In primo luogo, come sottolinea Viswanath sopra utilizzando removeView() si blocca, come di seguito sempre (a prescindere dal ciclo)

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

La seconda questione è che il ciclo sarà modo sempre schianto parte attraverso perché, come si elimina ogni pulsante il numero di le visualizzazioni nel menuMultipleActions diminuisce di uno. La soluzione a questo sarebbe essere sia a ciclo all'indietro, o di cancellare sempre il bambino zeroth esempio

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

Anche se potrei essere più inclini a utilizzare menuMultipleActions.getChildCount() come un modo più sicuro di trovare il numero di pulsanti.

La soluzione più generale, che funzionerà in un ciclo o per rimuovere qualsiasi singolo pulsante da id, sarebbe quella di utilizzare findViewById per trovare il pulsante prima di eliminarlo. ad esempio

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

Se un'etichetta è impostato per il FloatingActionButton è anche possibile utilizzare findViewByTag perché l'implementazione utilizza l'etichetta come il tag.