DialogFragment布局动画和“试图在绘图时破坏窗口!”错误

问题描述 投票:5回答:5

我有一个DialogFragment,它的视图中有一些布局的动画。当我关闭对话框时,我想要执行动画,当动画结束时,执行关闭操作。

第1步:从我的活动中调用片段:

myDialog.show(getSupportFragmentManager(), "");

第2步:用户使用对话框完成作业后,按下一个按钮。该按钮调用动画,之后我希望对话框消失:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View layout = inflater.inflate(R.layout.my_layout, null);

        layMain = (LinearLayout) layout.findViewById(R.id.layMain);

        TextView btnCancel = (TextView) layout.findViewById(R.id.btnCancel);
            btnCancel.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    final Animation anim = AnimationUtils.loadAnimation(getActivity(), R.anim.translate_to_bottom);
                    anim.setAnimationListener(new AnimationListener() {

                        @Override
                        public void onAnimationStart(Animation animation) {

                        }

                        @Override
                        public void onAnimationRepeat(Animation animation) {

                        }

                        @Override
                        public void onAnimationEnd(Animation animation) {
                            dismiss();
                        }
                    });
                    layMain.startAnimation(anim);
                }
            });
.....

当动画结束时,对话框被解除但我在logcat上遇到此错误

E / ViewRootImpl(25507):绘图时试图破坏窗口! E / ViewRootImpl(25507):window = android.view.ViewRootImpl@427348e0,title = com.mypackage / com.mypackage.MyActivity

我怎么能阻止这个?

稍后编辑:如果我使用它没有任何动画,一切正常,并且在logcat上没有显示错误。所以我想它必须对动画做些什么。

我正在使用的动画:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false" >

  <translate
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromYDelta="0%p"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:toYDelta="80%p" />

</set>
android android-dialogfragment
5个回答
8
投票

到目前为止唯一可行的解​​决方案是:

@Override
public void onAnimationEnd(Animation animation) {
    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            dismiss();
        }
    }, 10);

}

我对任何其他建议持开放态度


2
投票

您将片段上下文作为getSupportFragmentManager()传递。所以你必须改变它:

myDialog.show(getFragmentManager(), "");

2
投票

我没有看到任何这样的问题:

public class MyDIalog extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final Button b = new Button(getActivity());
        final Dialog d = super.onCreateDialog(savedInstanceState);
        d.setContentView(b);

        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                b.animate().rotationYBy(180).setDuration(500).setListener(new Animator.AnimatorListener() {
                    @Override
                    public void onAnimationStart(Animator animator) {
                    }

                    @Override
                    public void onAnimationEnd(Animator animator) {
                        dismiss();
                    }

                    @Override
                    public void onAnimationCancel(Animator animator) {
                    }

                    @Override
                    public void onAnimationRepeat(Animator animator) {
                    }
                });
            }
        });

        return d;
    }

}

适用于:

new MyDIalog().show(getFragmentManager(),"dialog");

无论如何,您可以稍后使用以下方式安排dismiss()调用:

 @Override
 public void onAnimationEnd(Animator animator) {
   getActivity().runOnUiThread(new Runnable() {
    @Override
    public void run() {
      dismiss();
    }
   });
 }

0
投票

你可以像这样使用。

@Override 
public void onAnimationEnd(Animation animation) {
    Handler handler = new Handler(); 
    handler.post(new Runnable() {
        @Override 
        public void run() { 
            dismiss(); 
        } 
    }); 
}

在这里,优点是,你没有定义自己的时间,这样它可以帮助保持其他一切简单,因为如果在动画结束后保持对话而不解散,用户甚至可以在短时间内惊讶你。


0
投票

我不确定回答你的问题是否为时已晚,但摆脱这个错误的唯一方法是在onAnimationEnd()的视图post方法中发布对话删除代码。 例如:

view.post(new Runnable() {  
    @Override  
    public void run() {  
        windowManager.removeView(layout);
    } 
});
© www.soinside.com 2019 - 2024. All rights reserved.