2015-10-17 2 views
7

Android Floating Action Button Lib UsedNull-Zeiger-Ausnahme auf Kind in onMeasure(): futuresimple/Floating-Action-Taste

I Aktionsmenü in xml Datei erstellt Schwimmdock und Erstellung von dynamischer Floating Action-Taste unter diesem Floating Action-Menü. Ich stelle Bildbitmap auf jedem FAB ein. Unter bestimmten Bedingungen muss ich alle Tasten im Floating-Action-Menü entfernen. Aber auf removeView() Methode, bekomme ich Null Pointer Exception auf Kindobjekt, wenn es versucht, Sichtbarkeit von Kind in onMeasure() Methode zu bekommen. Unten ist Stack-Trace und mein Code.

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 

-Code zum Hinzufügen einer Entfernung von Floating-Aktionstaste dynamisch:

 @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

Konnten Sie die Methode onMeasure() veröffentlichen. einführende Zeile FloatingActionsMenu.java:224? –

+0

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

+0

Können Sie versuchen mit menuMultipleActions.removeButton() anstelle von removeView? Weil es intern einige Flags in der Methode für sein Kind manipuliert. –

Antwort

3

Versuchen menuMultipleActions.removeButton() statt removeView() Methode. Intern manipuliert die removeButton einige Flags.

FloatingActionButton.java

+0

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

2

Es gibt zwei Probleme mit dem Code gegeben. Zum einen als Viswanath wie unten immer oben mit RemoveView() weist darauf hin, stürzt (unabhängig von der Schleife)

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

Das zweite Problem ist, dass die Schleife immer Crash teilweise durch, weil, wie Sie jede Taste, um die Nummer löschen von Ansichten in menuMultipleActions verringert sich um eins. Die Lösung dieses Problems würde entweder Schleife rückwärts, oder immer das nullte Kind zB

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

löschen Obwohl ich eher geneigt sein könnte menuMultipleActions.getChildCount() als sicherer Weg zu finden, um die Anzahl der Tasten zu verwenden.

Die allgemeinere Lösung, die in einer Schleife arbeiten oder jede einzelne Taste von ID zu entfernen wäre findViewById zu verwenden, um die Taste vor dem Löschen zu finden.

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

Wenn ein Label für die FloatingActionButton eingestellt ist, können Sie auch findViewByTag verwenden, da die Umsetzung des Etiketts als Tag verwendet.