【发布时间】:2021-08-05 00:17:36
【问题描述】:
我有一个活动,它基本上是一个包含片段的导航底部栏。如果用户已登录,底部导航显示 4 个片段:市场、收藏、上传和个人资料。如果用户是访客,则有两个片段:市场和登录。
以前,每次有人从一个片段交换到另一个片段时,它都会再次生成。但是,我想保存片段的状态,所以如果有人在市场上应用了过滤器并回来,它必须保持过滤器的应用。我尝试实现这个解决方案https://medium.com/@oluwabukunmi.aluko/bottom-navigation-view-with-fragments-a074bfd08711,但我觉得目前还不是最好的。
导航活动的代码是:
public class NavigationActivity extends AppCompatActivity {
final Fragment market= new MarketFragment();
final Fragment favorite = new FavoriteFragment();
final Fragment updateProduct = new AddProductFragment();
final Fragment userProfile = new UserProfileFragment();
final Fragment loginregister = new LoginOrRegisterFragment();
final FragmentManager fm = getSupportFragmentManager();
Fragment active = market;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(UnipopApp.usuariLoggejat.getUserLogged() != null){
setContentView(R.layout.main);
}
else{
setContentView(R.layout.main_guest);
}
setUpNavigation();
}
public void setUpNavigation() {
BottomNavigationView bottomNavigationView;
if(UnipopApp.usuariLoggejat.getUserLogged() != null) {
bottomNavigationView = findViewById(R.id.bottom_navigation);
bottomNavigationView.setOnNavigationItemSelectedListener(mOnNavegationItemSelectedListener);
fm.beginTransaction().add(R.id.nav_host_fragment, favorite, "2").hide(favorite).commit();
fm.beginTransaction().add(R.id.nav_host_fragment, updateProduct, "3").hide(updateProduct).commit();
fm.beginTransaction().add(R.id.nav_host_fragment, userProfile, "5").hide(userProfile).commit();
fm.beginTransaction().add(R.id.nav_host_fragment, market, "1").commit();
}
else {
bottomNavigationView = findViewById(R.id.bottom_navigation_guest);
bottomNavigationView.setOnNavigationItemSelectedListener(mOnNavegationItemSelectedListener);
fm.beginTransaction().add(R.id.nav_host_fragment_guest, loginregister, "6").hide(loginregister).commit();
fm.beginTransaction().add(R.id.nav_host_fragment_guest, market, "1").commit();
}
}
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavegationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.action_home:
fm.beginTransaction().hide(active).show(market).commit();
active = market;
return true;
case R.id.action_favorites:
fm.beginTransaction().hide(active).show(favorite).commit();
active = favorite;
return true;
case R.id.addProduct_fragment:
fm.beginTransaction().hide(active).show(updateProduct).commit();
active = updateProduct;
return true;
case R.id.action_user_profile:
fm.beginTransaction().hide(active).show(userProfile).commit();
active = userProfile;
return true;
case R.id.action_user_profile_guest:
fm.beginTransaction().hide(active).show(loginregister).commit();
active = loginregister;
return true;
}
return false;
}
};
}
它有效,但我不得不删除导航图......但是,问题是当有人将产品标记为市场上的最爱并移动到最喜欢的片段时,它不会出现。显然,它只是再次显示片段,而不是通过来自服务器的调用返回片段。
我正在寻找其他选择,因为我不喜欢这种解决方案。如果有人能帮我一把,那就太好了。
谢谢
【问题讨论】:
-
您使用的解决方案非常消耗内存并且不可扩展。我希望您必须使用 shareviewmodel 并将您的状态保存到其中。您应该结合使用片段 onSavedInstance() 和共享视图模型。当您切换回底部导航栏中的片段时,视图模型将传回非配置数据,例如最后过滤的结果列表。此外,您可能需要做一些小的 UI 更新,例如显示过滤器计数、通过从保存的实例中检索这些状态数据来平滑滚动到最后滚动的位置
-
您有任何示例代码吗?
标签: java android kotlin android-fragments android-activity