2015-10-17 6 views
7

Android Floating Action Button Lib UsedNull Pointer Exception na dziecko w onMeasure(): futuresimple/zmiennoprzecinkowych działanie przycisku

stworzyłem Pływające menu opcję w xml pliku i tworzenie dynamicznych Pływający przycisk Działania w ramach tego działania Pływające menu. Ustawiam mapę bitową na każdym urządzeniu FAB. W niektórych szczególnych warunkach muszę usunąć wszystkie przyciski w pływającym menu akcji. Ale na metodzie removeView(), otrzymuję Null Pointer Exception na obiekcie podrzędnym, gdy próbuje uzyskać widoczność dziecka w metodzie onMeasure(). Poniżej znajduje się ślad stosu i mój kod.

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 

Kod dodawania dynamicznie się usuwając Pływający przycisk czynności:

 @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

Czy możesz opublikować metodę onMeasure(). w tym linia FloatingActionsMenu.java:224? –

+0

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

+0

Możesz spróbować użyć menuMultipleActions.removeButton() zamiast removeView? Beacuse to wewnętrznie manipuluje niektórymi flagami w metodzie swojego dziecka. –

Odpowiedz

3

Spróbuj użyć menuMultipleActions.removeButton() zamiast removeView() metoda. Wewnętrznie removeButton manipuluje niektórymi flagami.

FloatingActionButton.java

+0

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

2

Istnieją dwa problemy z kodem danego. Po pierwsze, jak Viswanath zaznacza powyżej używając removeView() jak poniżej zawsze wywala (bez pętli)

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

Drugim problemem jest to, że pętla będzie zawsze katastrofy częściowo wysunięty bo jak każdy przycisk Usuń liczbę widoki w menuMultipleActions zmniejsza się o jeden. Rozwiązaniem tego problemu byłoby być albo do pętli w tył, albo zawsze usuwać zerowego dziecko tu np

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

Chociaż mogę być bardziej skłonni do korzystania menuMultipleActions.getChildCount() jako bezpieczniejszy sposób znajdowania liczbę przycisków.

Bardziej ogólne rozwiązanie, które będzie działać w pętli lub aby usunąć pojedynczy przycisk po id byłoby użyć findViewById, aby znaleźć przycisk przed usunięciem go. np

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

Jeżeli etykieta jest ustawiony na FloatingActionButton można również użyć findViewByTag ponieważ realizacja używa etykiety jako znacznika.