到目前为止,我一直在尝试新的Navigation组件。但是,关于以下内容,我碰壁了。我的问题最好用一个例子来描述,所以让我举一个例子。
我认为这是一种很常见的情况,即应用程序具有登录屏幕,然后将用户转发到主屏幕,仪表板或类似的东西。让我们坚持命名-LoginScreen
和HomeScreen
。
说该应用程序非常简单。它从LoginScreen
开始,并且用户登录后立即将他们转发到HoneScreen
。相当简单的应用程序,但可以作为示例。
现在,如果用户回击,我们如何退出该应用程序?到目前为止,它总是带我去LoginScreen
。
在此示例中进一步发展。想象一下,在登录屏幕之前有一个欢迎屏幕,用户可以决定登录还是注册。在这种情况下,一个人又该如何处理?
本质上,我想问的是导航组件中是否有内置功能,可让您返回多个屏幕,如果没有,是否有办法实现?非常感谢。
答案 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()
,ActivityA
和ActivityB
,并且您想从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();