如何从一个活动返回到处于保存状态的另一个活动?

时间:2019-07-09 08:10:11

标签: java android android-fragments android-activity

因此,我在主要活动中做了一个底部导航视图,并设置了片段。它有效,一切都很好。但是,这只是一个问题。当我进入下一个活动的设置时,我有一个带有后退按钮的工具栏,代码如下:

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
        finish();
        return true;
    }

    return super.onOptionsItemSelected(item);
}

那成功地使我返回了上一个活动。但是问题是我返回的不是个人档案片段(用户单击设置按钮的位置),而是返回家中。事情是我在MainActivity.java中这样做的:

getSupportFragmentManager().beginTransaction().replace(R.id.frameView, new HomeFragment())
.commit();

即使我想将finish()函数与使用中的上一个片段(设置片段)一起使用,这也会使我返回到原始片段。但是,如果我删除此行,则无法在应用程序的启动/启动中加载home片段。所以我处于两难境地。

这是我的底部导航视图代码:

private BottomNavigationView.OnNavigationItemSelectedListener navigationViewListener = new BottomNavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        return SelectItem(item.getItemId());
    }
};

然后我有这个方法:

private boolean SelectItem(int id) {
    Fragment selectedFragment = null;

    switch (id) {
        case R.id.nav_home:
            selectedFragment = new HomeFragment();
            break;
        case R.id.nav_files:
            selectedFragment = new FilesFragment();
            break;
        case R.id.nav_message:
            selectedFragment = new MessageFragment();
            break;
        case R.id.nav_profile:
            selectedFragment = new ProfileFragment();
            break;
    }

    getSupportFragmentManager().beginTransaction().replace(R.id.frameView, selectedFragment).commit();
    return true;
}

所以我继续执行onCreate()函数,并执行以下操作:

BottomNavigationView navigationView = findViewById(R.id.navigation_view); 
navigationView.setOnNavigationItemSelectedListener(navigationViewListener);
SelectItem(R.id.nav_home);

注意:该设置是另一项活动,而不是片段。我只是从配置文件片段加载它。当我从设置活动中返回时,我只想使用与我留下的片段相同的片段(即配置文件片段)进入主活动。

我的问题已经解决了。如果有人想提出改进建议,欢迎他回答。

2 个答案:

答案 0 :(得分:1)

因此,在尝试了很多事情之后,我发现了这种简单的方法来完成自己想要的事情。它不是那么干净,但是可以。只需定义一个变量

boolean firstTime = true;

然后转到onCreate()方法并说:

if (firstTime) {
   SelectItem(R.id.home);
}

它就像一种魅力。

答案 1 :(得分:0)

您可以使用以下条件包装添加的片段行:

if (getSupportFragmentManager().getBackStackEntryCount() == 0){
     getSupportFragmentManager().beginTransaction().replace(R.id.frameView, new HomeFragment()).commit();
}

上面的行将检查是否已经附加了片段。