使用 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 导入部门

使用 MAX Date 显示最新日期

正确使用 __format__

python之 __getattr____getattr____getitem____setitem__ 使用

使用 AUTOLAYOUT 和 SIZECLASSES 对齐视图

使用多个文本区域居中多个标签[重复]