【问题标题】:overridePendingTransition does not work when FLAG_ACTIVITY_REORDER_TO_FRONT is used使用 FLAG_ACTIVITY_REORDER_TO_FRONT 时 overridePendingTransition 不起作用
【发布时间】: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 行),则没有问题。

是否可以通过动画将活动置于前面?

非常感谢!

【问题讨论】:

    标签: android android-intent transition flags


    【解决方案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;
        }
        

        【讨论】:

          猜你喜欢
          • 2014-08-19
          • 2012-07-07
          • 1970-01-01
          • 1970-01-01
          • 2022-12-23
          • 1970-01-01
          • 1970-01-01
          • 2011-06-18
          相关资源
          最近更新 更多