6

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

Step1:从我的活动中调用片段:

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>
4

5 回答 5

8

到目前为止,唯一有效且不会引发错误的解决方案是:

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

}

我愿意接受任何其他建议

于 2013-08-08T06:51:52.067 回答
2

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

myDialog.show(getFragmentManager(), "");
于 2013-07-29T12:37:04.330 回答
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();
    }
   });
 }
于 2013-08-01T08:08:37.297 回答
0

你可以这样使用。

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

在这里,优点是,您无需定义自己的时间,这样可能有助于保持其他一切简单,因为如果在动画结束后对话框保持不关闭,用户即使在很短的时间内也会让您感到惊讶。

于 2015-08-26T14:06:15.483 回答
0

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

view.post(new Runnable() {  
    @Override  
    public void run() {  
        windowManager.removeView(layout);
    } 
});
于 2019-02-26T07:12:32.053 回答