因此,我在主要活动中做了一个底部导航视图,并设置了片段。它有效,一切都很好。但是,这只是一个问题。当我进入下一个活动的设置时,我有一个带有后退按钮的工具栏,代码如下:
@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);
注意:该设置是另一项活动,而不是片段。我只是从配置文件片段加载它。当我从设置活动中返回时,我只想使用与我留下的片段相同的片段(即配置文件片段)进入主活动。
我的问题已经解决了。如果有人想提出改进建议,欢迎他回答。
答案 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();
}
上面的行将检查是否已经附加了片段。