我有一个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>
到目前为止唯一可行的解决方案是:
@Override
public void onAnimationEnd(Animation animation) {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
dismiss();
}
}, 10);
}
我对任何其他建议持开放态度
您将片段上下文作为getSupportFragmentManager()传递。所以你必须改变它:
myDialog.show(getFragmentManager(), "");
我没有看到任何这样的问题:
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();
}
});
}
你可以像这样使用。
@Override
public void onAnimationEnd(Animation animation) {
Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
dismiss();
}
});
}
在这里,优点是,你没有定义自己的时间,这样它可以帮助保持其他一切简单,因为如果在动画结束后保持对话而不解散,用户甚至可以在短时间内惊讶你。
我不确定回答你的问题是否为时已晚,但摆脱这个错误的唯一方法是在onAnimationEnd()的视图post方法中发布对话删除代码。 例如:
view.post(new Runnable() {
@Override
public void run() {
windowManager.removeView(layout);
}
});