如何浏览一个以上的屏幕?

时间:2018-10-14 06:55:08

标签: android android-architecture-navigation

到目前为止,我一直在尝试新的Navigation组件。但是,关于以下内容,我碰壁了。我的问题最好用一个例子来描述,所以让我举一个例子。

我认为这是一种很常见的情况,即应用程序具有登录屏幕,然后将用户转发到主屏幕,仪表板或类似的东西。让我们坚持命名-LoginScreenHomeScreen

说该应用程序非常简单。它从LoginScreen开始,并且用户登录后立即将他们转发到HoneScreen。相当简单的应用程序,但可以作为示例。

现在,如果用户回击,我们如何退出该应用程序?到目前为止,它总是带我去LoginScreen

在此示例中进一步发展。想象一下,在登录屏幕之前有一个欢迎屏幕,用户可以决定登录还是注册。在这种情况下,一个人又该如何处理?

本质上,我想问的是导航组件中是否有内置功能,可让您返回多个屏幕,如果没有,是否有办法实现?非常感谢。

3 个答案:

答案 0 :(得分:1)

您可以尝试以下方法:

Intent myIntent = new Intent(LoginScreen.this, HomeScreen.class);
startActivity(myIntent);
finish(); //finish LoginScreen, then when press back in HomeScreen, it will exit instead return LoginScreen

答案 1 :(得分:1)

@Fred

要实现此目的,您可以在开始另一个活动之后完成每个活动。例如,WelcomeScreen调用了LoginScreen,您可以直接完成操作,而LoginScreen调用HomeScreen时,可以完成LoginScreen,以便用户从{{1 }}所有活动将关闭。

或者,从当前活动中,您可以调用HomeScreen退出应用程序。当您有很多活动时,此功能就可以使用,但是如果您有一个活动,则System.exit(0)

不会有任何区别

另一种情况如您在注释中所述: 考虑到您有以下活动:finish()ActivityAActivityB,并且您想从ActivityC回到ActivityA,而不必经过ActivityC。如果ActivityB以前已经打开过,则可以根据需要将其重新显示在前面。通过我们的示例,我们考虑了活动何时结束:

ActivityA

或者您可能有另外一种情况,其中 @Override protected void onDestroy() { super.onDestroy(); //this will bring the ActivityA on the front Intent intent=new Intent(this,ActivityA.class); intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(intent); } 仅在尚未连接的情况下才启动,否则您将直接连接到LoginActivity。在这种情况下,我将创建一个 Singleton ,它将帮助我注册当前的呼叫活动,以便我知道成功登录后将直接启动哪个活动。

例如:

HomeScreen

然后一次登录if(sharedPreferences!=null) { if (sharedPreferences.getBoolean("user_connected",false)){ startActivity(new Intent(this, HomeScreen.class));} else { MySingleton.getInstance().setCurrentCallingActivity("HomeScreen"); startActivity(new Intent(this, LoginActivity.class)); } } ,成功登录后,我将执行以下操作:

LoginActivity

这就是我的处理方式,并且有效。您可以自行查看相应的方案,然后尝试是否可行。不同的方法可能并存,这远非表现良好。

答案 2 :(得分:0)

首先,您需要查看您是喜欢使用活动还是片段

如果要删除堆栈中的所有片段,则需要使用

 FragmentManager fms = getSupportFragmentManager();
 for (int i = 0; i < fms.getBackStackEntryCount(); ++i) {
                        fms.popBackStack(); }

如果要删除特定片段,则必须使用标签。

Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT);
if(fragment != null)
getSupportFragmentManager().beginTransaction().remove(fragment).commit();
  

现在有关活动,您需要考虑一些选项

活动A是您的登录名。 活动B是您的注册页面。 活动C是您的主页。

如果要在成功登录后从A移到C而不是使用

Intent intent = new Intent(Login.this, MainActivity.class);
startActivity(intent);
finish();

如果要从A移到B

Intent intent = new Intent(Login.this, Register.class);
startActivity(intent);

如果您想从A移至B,并且在注册成功后移至C,则不要使用:

Intent intent = new Intent(LoginSM.this, MainActivitySM.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();