从另一个 Activity 返回到 DialogFragment 会重复使用我的输入动画
Returning to DialogFragment from another Activity reuses my enter animation
我有一个 Activity (A) 创建 DialogFragment。在该 DialogFragment 中,我有一个创建新 Activity (B) 的按钮。当我完成 Activity B 时,它会显示来自 Activity A 的 DialogFragment 并重新使用我设置的自定义动画。如何防止我的 DialogFragment 在返回 Activity A 时重复使用该动画?
此答案适用于某些设备,但它会在某些设备上冻结整个 window(因此检查版本)
@Override
public void onStop() {
super.onStop();
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) {
getDialog().getWindow().setWindowAnimations(-1);
}
}
这就是我创建自定义 DialogFragment enter/exit 动画的方式:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.getWindow().getAttributes().windowAnimations = R.style.FragmentDialogAnim;
return dialog;
}
<style name="FragmentDialogAnim">
<item name="android:windowEnterAnimation">@anim/loginactivity_left_to_right</item>
<item name="android:windowExitAnimation">@anim/loginactivity_right_to_left</item>
</style>
loginactivity_left_to_right:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate android:fromXDelta="-100%" android:toXDelta="0%"
android:fromYDelta="0%" android:toYDelta="0%"
android:duration="700"/>
</set>
loginactivity_right_to_left:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
android:fromXDelta="0%" android:toXDelta="-100%"
android:fromYDelta="0%" android:toYDelta="0%"
android:duration="700" />
</set>
下面是创建 DialogFragment 的代码:
回收视图总是有问题,尤其是当您希望它在每种情况下略有不同时。
我建议您要么停止回收此对话框,而是为每个不同的案例创建一个特定的对话框,或者您只是传递一个标志进入你的 Dialog 定义 what/when 以使用动画。
您应该在 DialogFragment 的 onPause() 方法而不是 onStop() 方法中禁用动画。只需删除您当前在 onStop() 方法中的所有代码行,并使用以下代码行添加 onPause():
@Override
public void onPause() {
super.onPause();
if(getDialog()!=null)
getDialog().getWindow().setWindowAnimations(-1);
}
通过在 onPause() 方法中执行此操作,您可以禁用所有 window 动画,同时不会冻结任何触摸事件。
我有一个 Activity (A) 创建 DialogFragment。在该 DialogFragment 中,我有一个创建新 Activity (B) 的按钮。当我完成 Activity B 时,它会显示来自 Activity A 的 DialogFragment 并重新使用我设置的自定义动画。如何防止我的 DialogFragment 在返回 Activity A 时重复使用该动画?
此答案适用于某些设备,但它会在某些设备上冻结整个 window(因此检查版本)
@Override
public void onStop() {
super.onStop();
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) {
getDialog().getWindow().setWindowAnimations(-1);
}
}
这就是我创建自定义 DialogFragment enter/exit 动画的方式:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.getWindow().getAttributes().windowAnimations = R.style.FragmentDialogAnim;
return dialog;
}
<style name="FragmentDialogAnim">
<item name="android:windowEnterAnimation">@anim/loginactivity_left_to_right</item>
<item name="android:windowExitAnimation">@anim/loginactivity_right_to_left</item>
</style>
loginactivity_left_to_right:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate android:fromXDelta="-100%" android:toXDelta="0%"
android:fromYDelta="0%" android:toYDelta="0%"
android:duration="700"/>
</set>
loginactivity_right_to_left:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
android:fromXDelta="0%" android:toXDelta="-100%"
android:fromYDelta="0%" android:toYDelta="0%"
android:duration="700" />
</set>
下面是创建 DialogFragment 的代码:
回收视图总是有问题,尤其是当您希望它在每种情况下略有不同时。
我建议您要么停止回收此对话框,而是为每个不同的案例创建一个特定的对话框,或者您只是传递一个标志进入你的 Dialog 定义 what/when 以使用动画。
您应该在 DialogFragment 的 onPause() 方法而不是 onStop() 方法中禁用动画。只需删除您当前在 onStop() 方法中的所有代码行,并使用以下代码行添加 onPause():
@Override
public void onPause() {
super.onPause();
if(getDialog()!=null)
getDialog().getWindow().setWindowAnimations(-1);
}
通过在 onPause() 方法中执行此操作,您可以禁用所有 window 动画,同时不会冻结任何触摸事件。