【发布时间】:2015-03-26 09:38:47
【问题描述】:
我有一个MainActivity(它有launchMode=singleTop),我可以通过它进行其他活动,例如B 和C。现在,我想通过单击B 和C 中的某个按钮导航回MainActivity。我还想要过渡动画。
这是代码
CODE 1
Intent intent=new Intent(this,MainActivity.class);
Bundle animation= ActivityOptions.makeCustomAnimation(getApplicationContext(), R.animator.translate_left_to_right, R.animator.translate_source_left_to_right).toBundle();
startActivity(intent,animation);
finish();
上面的代码工作正常,除了MainActivity 的新实例是在旧实例之上创建的!我不希望这种情况发生。因此,经过一番研究,我尝试了以下代码
CODE 2
Intent intent=new Intent(this,ListingActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Bundle animation= ActivityOptions.makeCustomAnimation(getApplicationContext(), R.animator.translate_left_to_right, R.animator.translate_source_left_to_right).toBundle();
startActivity(intent,animation);
finish();
此代码似乎消除了创建活动新实例的问题,因为标志 FLAG_ACTIVITY_CLEAR_TOP 负责处理它。但是,现在过渡动画似乎不起作用!
标志FLAG_ACTIVITY_CLEAR_TOP 不允许任何动画吗?我的问题的解决方案是什么?我既需要动画过渡,也不需要创建 MainActivity 的新实例。
编辑
正如 David Wasser 所建议的那样,这似乎起到了作用。
Intent intent=new Intent(this,ListingActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
finish();
overridePendingTransition(R.animator.translate_left_to_right,R.animator.translate_source_left_to_right);
但是动画不流畅。动画中有一个小问题。我认为这是因为活动(B 或 C)在动画完成之前被破坏。我不确定
发布动画文件
translate_left_to_right.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="-100%p"
android:toXDelta="0%p"
android:duration="400"/>
translate_right_to_left.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="100%p"
android:toXDelta="0"
android:duration="400"/>
translate_source_left_to_right.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0%p"
android:toXDelta="50%p"
android:duration="400"/>
translate_source_right_to_left.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="-50%p"
android:duration="400"/>
【问题讨论】:
-
尝试设置
Intent.FLAG_ACTIVITY_SINGLE_TOP和Intent.FLAG_ACTIVITY_CLEAR_TOP,看看是否有帮助。 -
如果这不起作用,您可以在调用
finish()后尝试使用overridePendingTransition(int enterAnim, int exitAnim)看看是否有帮助。 -
@DavidWasser :我通过将 MainActivity 设为“singleInstance”来使其工作。但问题仍然存在——CLEAR_TOP 怎么能让动画消失?
-
恐怕使用单实例启动模式会给您带来比您预想的更多的麻烦。您的应用程序现在在 2 个单独的任务中运行。当您在顶部有活动 B 或 C 时,请尝试按 HOME 并查看最近的任务列表。这是一个非常糟糕的解决方案。
-
@DavidWasser hmmm.. 那么解决方案应该是什么。我尝试了您的第一个解决方案。这似乎行不通。将尝试覆盖并让您知道。
标签: android android-intent android-animation