使用 FLAG_ACTIVITY_REORDER_TO_FRONT 时 overridePendingTransition 不起作用
Posted
技术标签:
【中文标题】使用 FLAG_ACTIVITY_REORDER_TO_FRONT 时 overridePendingTransition 不起作用【英文标题】:overridePendingTransition does not work when FLAG_ACTIVITY_REORDER_TO_FRONT is used 【发布时间】:2011-06-05 17:37:57 【问题描述】:我在堆栈中有两个活动,为了显示它们,我使用了 FLAG_ACTIVITY_REORDER_TO_FRONT。到目前为止一切顺利,当我想使用 overridePendingTransition 为活动带来动画时,问题就来了。
Intent i = new Intent(ActivityA.this, ActivityB.class);
i.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
ActivityA.this.startActivity(i);
overridePendingTransition(R.anim.transition_to_right, R.anim.transition_to_left);
没有显示转换,但是,如果未将标志添加到意图(删除第 2 行),则没有问题。
是否可以通过动画将活动置于前面?
非常感谢!
【问题讨论】:
【参考方案1】:实际上,使用 REORDER_TO_FRONT 时正确的解决方案是在要打开的活动的 onNewIntent() 方法中调用 overridePendingTransition。
@Override
protected void onNewIntent(Intent intent)
super.onNewIntent(intent);
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
替换为您的转换。
如果您需要选择性地替换转换,您可以在您的意图中添加一个额外的并在 onNewIntent() 中检查它以决定要做什么。
如果您不知道将要打开的转换(例如,如果您没有明确指定它),则此方法不合适,否则是正确的解决方案。
【讨论】:
唯一合适的解决方案。应该被接受的答案。 我希望我知道为什么有些人不赞成我的回答,正如 tomrozb 所说,这是唯一合适的解决方案 由于在创建活动时不会调用onNewIntent
,因此您还必须在开始活动的位置执行overridePendingTransition
。
我很明显 :-) 我从来没有说过你只需要在一个地方做。顺便说一句:现在应该使用导航控制器
我花了几个小时寻找解决方案。干杯【参考方案2】:
我遇到了同样的问题。诀窍是覆盖 onResume() 回调中的转换。
@Override
public void onResume()
super.onResume();
overridePendingTransition(R.anim.transition_to_right, R.anim.transition_to_left);
【讨论】:
通过在 onResume() 中执行。将第一个活动置于顶部时,效果一点也不流畅,它出现了一个混蛋 当我从服务开始一项新活动并且需要覆盖挂起的转换时,这对我有用! 这个建议不正确。 onResume 在许多与正在使用的新意图无关的情况下被调用。正确的解决方案是我指出的:在 onNewIntent() 方法中做【参考方案3】:对我来说,解决方案是确保它在 UI 线程中运行
runOnUiThread(new Runnable()
public void run()
startActivity(new Intent(ActivityOne.this, ActivityTwo.class));
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
);
finish();
【讨论】:
就我而言,这正是我的错误【参考方案4】:我遇到了同样的问题。 我建议你检查你的 AndroidManifest.xml 以确保 ActivityA 和 ActivityB 都没有设置 Theme.Translucent.NoTitleBar,这个主题包含 "android:windowIsTranslucent"=true 导致问题。
希望对您有所帮助。
【讨论】:
【参考方案5】:打电话
overridePendingTransition(R.anim.transition_to_right, R.anim.transition_to_left);
完成后();结束活动对我有用。
finish();
overridePendingTransition(R.anim.transition_to_right, R.anim.transition_to_left);
比调用 onResume 更好,因为它使 Activity 更加独立于进入和退出动画:
发送者活动完成后调用:
活动 A ---进入转换 1(在 A 上)---> 活动 B ---进入转换 2(在 B 上)---> 活动 C
活动 A
活动 A ---进入转换 1(在 A 上)---> 活动 C ---进入转换 3(在 C 上)---> 活动 B
活动 A
调用接收者活动的 onResume:
活动 A ---进入转换 1(在 B 上)---> 活动 B ---进入转换 2(在 C 上)---> 活动 C
活动 A
活动 A ---进入转换 3(在 C 上)---> 活动 C ---进入转换 2(在 B 上)---> 活动 B
活动 A
这里的 onResume 动画无论是哪个发送者活动都必须是相同的,而不是第一种方法,您可以轻松地自定义动画。
【讨论】:
原始问题未说明原始活动正在完成。如果您在没有完成的情况下开始一个答案,则此答案无关紧要,【参考方案6】:我的同事遇到了这个问题,他设法通过添加最小 SDK 属性(5 及以上)来解决它。
因为这个功能从 api 5 开始可用,所以强制使用更高级别的 sdk 对我们来说是个窍门。
【讨论】:
【参考方案7】:如何在第二个活动的 onCreate() 或 onStart() 中创建动画。
【讨论】:
嗯...听起来是个好主意!多谢。我将学习如何处理动画并尝试一下。 @Daniel 查看 APIDemos(与 android 框架一起提供)com.example.android.apis.animation.Rotation3dAnimation.java 以及它在 Transition3D.java 中的使用方式。应该会给你很好的洞察力。 感谢 GSree 的帮助!我尝试在活动 A 的 onPause() 中启动滑出动画,并在活动 B 的 onResume() 中滑入。这是一个好主意,并且成功了,但不够流畅,你可以看到一种黑色的闪烁,因为动画不是同时执行的。我一直在努力,如果我找到一个好的解决方案,我会告诉它。 很高兴知道这一点。告诉我进展如何 当 onNewIntent() 方法被创建时,你为什么要这样做呢? onCreate()、onStart() 和 onResume() 的用途完全不同【参考方案8】:我做了类似的事情,我做了如下:
private Stack<String> stack;
ViewAnimator mViewAnimator;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
mViewAnimator = new ViewAnimator(this);
if (stack == null) stack = new Stack<String>();
push("FirstStackActivity", new Intent(this, FirstStackActivity.class));
@Override
public void finishFromChild(Activity child)
pop();
@Override
public void onBackPressed()
pop();
public void push(String id, Intent intent)
Window window = getLocalActivityManager().startActivity(id, intent);
if (window != null)
stack.push(id);
View view = window.getDecorView();
mViewAnimator.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));
mViewAnimator.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));
mViewAnimator.addView(view);
mViewAnimator.showNext();
setContentView(mViewAnimator);
public void pop()
if (stack.size() == 1) finish();
if (stack.size() > 0)
LocalActivityManager manager = getLocalActivityManager();
Intent lastIntent = manager.getActivity(stack.peek()).getIntent();
Window newWindow = manager.startActivity(stack.peek(), lastIntent);
View view = newWindow.getDecorView();
mViewAnimator.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_in));
mViewAnimator.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_out));
mViewAnimator.showPrevious();
mViewAnimator.removeView(view);
destroy(stack.pop());
/**
* BugFix official
* @param id
* @return
*/
public boolean destroy(String id)
final LocalActivityManager activityManager = getLocalActivityManager();
if (activityManager != null)
activityManager.destroyActivity(id, false);
try
final Field mActivitiesField = LocalActivityManager.class.getDeclaredField("mActivities");
if (mActivitiesField != null)
mActivitiesField.setAccessible(true);
@SuppressWarnings("unchecked")
final Map<String, Object> mActivities = (Map<String, Object>) mActivitiesField.get(activityManager);
if (mActivities != null)
mActivities.remove(id);
final Field mActivityArrayField = LocalActivityManager.class.getDeclaredField("mActivityArray");
if (mActivityArrayField != null)
mActivityArrayField.setAccessible(true);
@SuppressWarnings("unchecked")
final ArrayList<Object> mActivityArray = (ArrayList<Object>) mActivityArrayField.get(activityManager);
if (mActivityArray != null)
for (Object record : mActivityArray)
final Field idField = record.getClass().getDeclaredField("id");
if (idField != null)
idField.setAccessible(true);
final String _id = (String) idField.get(record);
if (id.equals(_id))
mActivityArray.remove(record);
break;
catch (Exception e)
e.printStackTrace();
return true;
return false;
【讨论】:
以上是关于使用 FLAG_ACTIVITY_REORDER_TO_FRONT 时 overridePendingTransition 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
如何使用:从 __future__ 使用 django 导入部门
python之 __getattr____getattr____getitem____setitem__ 使用