android — Исключение нулевого указателя на дочерний элемент в onMeasure (): кнопка futuresimple /float-action-button" />

Исключение нулевого указателя на дочерний элемент в onMeasure (): кнопка futuresimple /float-action-button

Используемая библиотека плавающих кнопок Android

Я создал меню плавающего действия в файле xml и создал динамическую кнопку плавающего действия в этом меню плавающего действия. Я устанавливаю растровое изображение на каждом FAB. При определенных условиях я должен удалить все кнопки в меню «Плавающее действие». Но при использовании метода removeView() я получаю Null Pointer Exception на дочернем объекте, когда он пытается получить видимость дочернего объекта в методе onMeasure(). Ниже приведена трассировка стека и мой код.

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

Код для динамического добавления удаляемой кнопки с плавающим действием:

       @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);
           }
       }
    }
7 голосов | спросил Android Expert 17 +03002015-10-17T12:22:52+03:00312015bEurope/MoscowSat, 17 Oct 2015 12:22:52 +0300 2015, 12:22:52

2 ответа


0

Попробуйте использовать menuMultipleActions.removeButton() вместо removeView() метод. Внутренне removeButton манипулирует некоторыми флагами.

FloatingActionButton.java

ответил Viswanath Lekshmanan 24 22015vEurope/Moscow11bEurope/MoscowTue, 24 Nov 2015 10:15:30 +0300 2015, 10:15:30
0

В приведенном коде есть две проблемы. Во-первых, как указывает Viswanath выше, при использовании removeView (), как показано ниже, всегда происходит сбой (независимо от цикла)

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

Вторая проблема заключается в том, что цикл всегда будет завершаться сбоем частично, потому что при удалении каждой кнопки количество представлений в menuMultipleActions уменьшается на единицу. Решением этой проблемы было бы либо вернуться назад, либо всегда удалить нулевой дочерний элемент, например

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

Хотя я, возможно, более склонен использовать menuMultipleActions.getChildCount () в качестве более безопасного способа определения количества кнопок.

Более общее решение, которое будет работать в цикле или для удаления любой отдельной кнопки по идентификатору, заключается в использовании findViewById для поиска кнопки до ее удаления. например,

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

Если для FloatingActionButton установлена ​​метка, вы также можете использовать findViewByTag, потому что реализация использует метку в качестве тега.

ответил QuantumTiger 30 12015vEurope/Moscow11bEurope/MoscowMon, 30 Nov 2015 17:57:11 +0300 2015, 17:57:11

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132