removeView不会立即删除View并破坏Layout

时间:2013-10-02 08:57:29

标签: android android-layout android-linearlayout

我正在尝试动态移除Android中LinearLayout中的某些组件。我实现的逻辑是:如果有人点击我的(侧边栏)Fragment中的按钮,我启动一个动画,将点击的Button向上移动,将其他按钮移出显示的左侧。动画触发AnimationListener,在动画完成后,迭代布局中的所有按钮并删除所有未单击的按钮。 问题是:如果我禁用淡出动画并使用我可以看到的调试器进入,removeView()Views仍在那里。

更大的问题是,如果我稍后手动设置X和Y位置,那么应该仍然可见的Button(点击的)会消失,只会再次显示。

有什么方法可以在删除时“修复”按钮,removeView()何时实际删除了查看/更新布局?

我已经尝试删除所有视图,然后再次添加Button,结果相同。

一些片段清除了一点:

//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);
            }
        });

我现在坚持这个问题两天了。当前按钮以正确的方式动画,然后,在动画完成后,所有按钮消失(也是单击按钮)。然后,在1/2秒后。另一个片段需要加载,点击的按钮再次出现

PS:我已经使用''mLayout.post()''安排删除,结果相同

1 个答案:

答案 0 :(得分:1)

如果您只是这样做会发生什么:

button.setVisibility(View.GONE) ;

在您的代码中添加了一些评论。

//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);
        }
    });