覆盖Material Design活动返回转换

时间:2016-02-20 15:26:21

标签: android material-design android-transitions activity-transition

我正在编写一个新版本的旧Android应用程序,通过使用材料设计指南,图标和效果使其更新。

我有一个登录屏幕作为我的第一个活动,我在onCreate方法中设置了退出转换:

getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
super.onCreate(savedInstanceState);
getWindow().setExitTransition(exitTransition());

...

private Transition exitTransition()
{
    Fade fade=new Fade();
    fade.excludeTarget(android.R.id.statusBarBackground, true);
    fade.excludeTarget(android.R.id.navigationBarBackground, true);

    return fade;
}

...不包括状态栏和导航栏,以避免它们褪色为白色然后再回到主要深色。

我使用以下方法设置了主要活动:

getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
super.onCreate(savedInstanceState);
getWindow().setEnterTransition(enterTransition());

...

private Transition enterTransition()
{
    Slide slide=new Slide();
    slide.excludeTarget(android.R.id.statusBarBackground, true);
    slide.excludeTarget(android.R.id.navigationBarBackground, true);
    slide.setSlideEdge(Gravity.END);

    return slide;
}

然后,我使用以下代码从登录活动中启动主要活动:

Intent myIntent=new Intent(getApplicationContext(), MainActivity.class);
myIntent.putExtra("vehicles", sb.toString());
startActivity(myIntent, ActivityOptionsCompat.makeSceneTransitionAnimation(LoginActivity.this, toolbar, "toolbar").toBundle());
new Handler().postDelayed(new Runnable()
{
    @Override
    public void run()
    {
        //Finish the login activity so it can't be returned to.
        LoginActivity.this.finish();
    }
}, 1000);

我不希望后退按钮在完成时将用户带回登录页面,因为这没有任何意义,所以我使用延迟完成以避免发生闪烁我在清单中使用noHistory。可能有更好的方法可以做到这一点,但到目前为止,我的Google搜索还没有提出更好的方法。

这一切都按照我的意愿行事。问题是当我从主要活动中按下后退按钮时。该应用程序尝试转换回现已完成的登录活动,而不是以正常方式退出应用程序,而不是:

Undesirable app close result

如您所见,共享工具栏尚未消失,FAB尚未消失,RecyclerView已将背景淡化为透明。当过渡结束时,这一切都消失了。

那么 - 让应用知道登录活动现在已经消失的正确方法是什么,而此处的后退按钮应该退出应用而不是尝试转换回去?

1 个答案:

答案 0 :(得分:0)

尝试将以下标记设置为Intent

//...setup intent

//set CLEAR_TASK and NEW_TASK flags
myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(myIntent, ActivityOptionsCompat.makeSceneTransitionAnimation(LoginActivity.this, toolbar, "toolbar").toBundle());