chuck258
chuck258

Reputation: 922

removeView doesn't remove View immediately and destroys Layout

I'm trying to dynamically remove some components in a LinearLayout in Android. The logic I have implemented is: If someone clicks a Button in my (Sidebar)Fragment I start an Animation that moves the clicked Button up and the Other Buttons out of the left side of the Display. The Animation triggers an AnimationListener that, after the Animation is complete, iterates over all Buttons in the Layout and removes all non clicked Buttons. The Problem is: if I disable the Fade Out Animation and step in with the debugger i can see, that after removeView() the Views are still there.

The even bigger Problem is that my Button that should still be Visible (the clicked one) disappears and only shows up again, if I set X and Y Position manually at a later Time.

Is there any way i can "fix" the Button while removal and when does removeView() actually remove the View/update the Layout?

I already tried to remove all Views and then add the Button again with the same result.

Some snippets to clear things up a Bit:

//Start Animation over all Components
//Commented out the move outside animation to ensure the Layout doesn't get streched in this process
        for (mComponentIterator = mLayout.getChildCount() - 1; mComponentIterator >= 0; mComponentIterator--) {
            final ImageTextButton currentButton = (ImageTextButton) mLayout
                    .getChildAt(mComponentIterator);
            ObjectAnimator buttonAnimation;
            if (!currentButton.equals(pClickedButton)) {
//              buttonAnimation = ObjectAnimator.ofFloat(currentButton, View.X, POSITION_OUTSIDE);
            } else {
//              buttonAnimation = ObjectAnimator.ofFloat(currentButton, View.Y, POSITION_UPPER);
                animations.add( ObjectAnimator.ofFloat(currentButton, View.Y, POSITION_UPPER));
                currentButton.setFocused(true);
                mSelectedButton = currentButton;
            }
//          animations.add(buttonAnimation);
        }
            buttonAnimations.playTogether(animations);
        buttonAnimations.setDuration(mShortAnimationDuration);
        buttonAnimations.setInterpolator(new DecelerateInterpolator());
        buttonAnimations.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator arg0) {
                for (mComponentIterator = mLayout.getChildCount() - 1; mComponentIterator >= 0; mComponentIterator--) {
                    final ImageTextButton currentButton = (ImageTextButton) mLayout
                            .getChildAt(mComponentIterator);
                    if (currentButton.equals(mSelectedButton)) {
                        if (mCurrentFragment != null) {

                             //This changes the Layout in another 
                             mListener.onChangeLayoutRequest(R.id.maincontent, mCurrentFragment);
                        }
                    } else {
                                mLayout.removeView(currentButton);
                    }
                }
            }
        });
        buttonAnimations.start();

//Callback when Activity is ready
mCurrentFragment.SetOnActivityCreatedListener(new OnActivityCreatedListener() {
                @Override
                public void onActivityCreated(Activity activity) {
                    Drawable grayMenuBackground = getActivity().getResources().getDrawable(
                            R.drawable.bg_menuitem);
                    Drawable coloredMenuBackground = grayMenuBackground.getConstantState()
                            .newDrawable();
                    coloredMenuBackground.setColorFilter(mSelectedMenuColor,
                            PorterDuff.Mode.SRC_ATOP);
                    LinearLayout.LayoutParams rightGravityParams = new LinearLayout.LayoutParams(
                            LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
                    rightGravityParams.gravity = Gravity.TOP;
                    rightGravityParams.weight = 0;

                    Drawable seperator = getResources().getDrawable(R.drawable.seperator_menu);
                    seperator.setBounds(new Rect(0, 0, mSelectedButton.getWidth(), 1));

                    int insertIndex = 1;
                    for (Button menuButton : mCurrentFragment.getMenuItems()) {

                        //Some Button setupcode
                    mLayout.addView(menuButton, insertIndex++);
                }
                //Here the Button gets visible again
                mSelectedButton.setLayoutParams(rightGravityParams);
                mSelectedButton.setX(POSITION_LEFT);
                mSelectedButton.setY(POSITION_UPPER);
            }
        });

Im stuck at this problem for two days now. Currently the Buttons Animate in the right manner, then, right after the animation has finished, all Buttons dissapear(also the Clicked Button). Then, after 1/2sec. the other fragment needs to load, the clicked button appears again

PS: I already scheduled the removal with ''mLayout.post()'' with the same result

Upvotes: 1

Views: 2632

Answers (1)

cYrixmorten
cYrixmorten

Reputation: 7108

What happens if you simply do:

button.setVisibility(View.GONE) ;

Added some comments along your code.

//Start Animation over all Components
//Commented out the move outside animation to ensure the Layout doesn't get streched in this process
    for (mComponentIterator = mLayout.getChildCount() - 1; mComponentIterator >= 0; mComponentIterator--) {
        final ImageTextButton currentButton = (ImageTextButton) mLayout
                .getChildAt(mComponentIterator);
        ObjectAnimator buttonAnimation;
        if (!currentButton.equals(pClickedButton)) {
//              buttonAnimation = ObjectAnimator.ofFloat(currentButton, View.X, POSITION_OUTSIDE);
        } else {
//              buttonAnimation = ObjectAnimator.ofFloat(currentButton, View.Y, POSITION_UPPER);

            /* 
             * You say that you want to keep the clicked button, yet you
             * add it to the animations?
             */

            animations.add( ObjectAnimator.ofFloat(currentButton, View.Y, POSITION_UPPER));
            currentButton.setFocused(true);
            mSelectedButton = currentButton;
        }
//          animations.add(buttonAnimation);
    }
        buttonAnimations.playTogether(animations);
    buttonAnimations.setDuration(mShortAnimationDuration);
    buttonAnimations.setInterpolator(new DecelerateInterpolator());
    buttonAnimations.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator arg0) {
            for (mComponentIterator = mLayout.getChildCount() - 1; mComponentIterator >= 0; mComponentIterator--) {
                final ImageTextButton currentButton = (ImageTextButton) mLayout
                        .getChildAt(mComponentIterator);
                if (currentButton.equals(mSelectedButton)) {
                    if (mCurrentFragment != null) {

                         //This changes the Layout in another 

                         /*
                          * What exactly does this do and why does it have to
                          * be done (numberOfButtons - 1) times?
                          */

                         mListener.onChangeLayoutRequest(R.id.maincontent, mCurrentFragment);
                    }
                } else {

                            /*
                             * This does indeed only remove the non selected buttons 
                             * I think, but the animation is still applied to 
                             * the selcted button.
                             * So it makes sense that you have to reset X and Y 
                             * to see it again.
                             */ 
                            mLayout.removeView(currentButton);
                }
            }
        }
    });
    buttonAnimations.start();

//Callback when Activity is ready
mCurrentFragment.SetOnActivityCreatedListener(new OnActivityCreatedListener() {
            @Override
            public void onActivityCreated(Activity activity) {
                Drawable grayMenuBackground = getActivity().getResources().getDrawable(
                        R.drawable.bg_menuitem);
                Drawable coloredMenuBackground = grayMenuBackground.getConstantState()
                        .newDrawable();
                coloredMenuBackground.setColorFilter(mSelectedMenuColor,
                        PorterDuff.Mode.SRC_ATOP);
                LinearLayout.LayoutParams rightGravityParams = new LinearLayout.LayoutParams(
                        LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
                rightGravityParams.gravity = Gravity.TOP;
                rightGravityParams.weight = 0;

                Drawable seperator = getResources().getDrawable(R.drawable.seperator_menu);
                seperator.setBounds(new Rect(0, 0, mSelectedButton.getWidth(), 1));

                int insertIndex = 1;
                for (Button menuButton : mCurrentFragment.getMenuItems()) {

                    //Some Button setupcode
                mLayout.addView(menuButton, insertIndex++);
            }
            //Here the Button gets visible again
            mSelectedButton.setLayoutParams(rightGravityParams);
            mSelectedButton.setX(POSITION_LEFT);
            mSelectedButton.setY(POSITION_UPPER);
        }
    });

Upvotes: 1

Related Questions