30

我正在努力使应用程序更具材料性,而我只是坚持如何实现一些共享元素转换。我有一个活动 A 启动另一个 B 然后调用 finish() 以便将其从后堆栈中删除。就我而言,我想在两个活动之间共享一个元素,但是一旦它从 A 传递到 B,A 就不再重要了。如果我在 startActivity(ctx,intent, bundle) 之后不调用 finish() ,则退出/进入动画效果很好。但是,如果我调用完成,在动画开始之前会有一个非常难看的闪烁。

有什么我忽略了,或者只是不可能做我想做的事?

4

6 回答 6

31

您可以在 onStop 函数中完成活动,如果您只想在从 A 转换到 B 时发生这种情况,然后创建一个标志并在调用 startActivity(ctx,intent, bundle) 后设置它:

@Override
public void onStop() {
    super.onStop();
    if(mShouldFinish)
         finish();
}

确保在完成活动 B 时调用 finish() 而不是 finishAfterTranstion() 因为活动 A 不再存在

完成活动 A 后,如果按返回,B 中的共享元素可能会挂在屏幕上。将 transitionName 设置为 nullActivityB.onEnterAnimationComplete以避免这种情况。

于 2015-04-16T00:07:23.313 回答
30

更新

更好更简单的方法

ActivityCompat. finishAfterTransition(this);

<3 支持库。

于 2015-07-06T20:39:13.103 回答
7

这可能为时已晚,但我遇到了同样的问题。对我有用的是:

supportFinishAfterTransition();

这包含在支持库中,就像魅力一样。

finish()PS:打电话时不需要打电话supportFinishAfterTransition()

于 2017-07-11T07:53:09.173 回答
2

在 5.0 及更高版本中尝试finishAfterTransition()方法,您可以在退出转换发生后完成活动。

于 2016-05-05T12:13:24.387 回答
2

如果你ActivityOptions.makeSceneTransitionAnimation(Activity, android.view.View, String)用来进行转换,你应该在 Activity B 中使用它的回调方法来完成 Activity A。

    setEnterSharedElementCallback(new SharedElementCallback() {
        @Override
        public void onSharedElementEnd(List<String> sharedElementNames, List<View> sharedElements, List<View> sharedElementSnapshots) {
            super.onSharedElementEnd(sharedElementNames, sharedElements, sharedElementSnapshots);
                // finish Activity A

        }
    });
于 2019-05-29T19:14:28.103 回答
2

我已经写了这个答案的一个变体,我觉得它更优雅一些,因为你不需要一个字段。
这仍然远非理想,但它适用于我的用例,它基本上是一个启动屏幕,并过渡到下一个屏幕,我希望立即关闭启动屏幕。这是有效的,因为onStop当活动不再可见时被调用,因此此时我们实际上可以关闭它而不会导致伪影(在这种情况下,这种闪烁/闪烁)

lifecycle.addObserver(object : LifecycleEventObserver {
    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
        if (event == Lifecycle.Event.ON_STOP) {
            lifecycle.removeObserver(this)
            finish()
        }
    }
})
于 2020-04-17T17:34:57.467 回答