我有一个
Activity
和一个BottomNavigationView
,它由4个Fragments
组成,每当我更改标签时Fragments
都会重新加载,这是我的Activity
的代码
public class MainHomeActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_home);
BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation);
bottomNavigationView.setOnNavigationItemSelectedListener(navigationItemSelectedListener);
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new HomeFragment()).commit();
}
private BottomNavigationView.OnNavigationItemSelectedListener navigationItemSelectedListener = new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull @NotNull MenuItem item) {
Fragment selectedFragment = null;
switch (item.getItemId()){
case R.id.nav_home:
selectedFragment = new HomeFragment();
break;
case R.id.nav_list:
selectedFragment = new UsersFragment();
break;
case R.id.nav_profile:
selectedFragment = new ProfileFragment();
break;
case R.id.nav_settings:
selectedFragment = new SettingsFragment();
break;
}
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, selectedFragment).commit();
return true;
}
};
}
在
Fragments
中,我正在从 parse
加载数据
我知道我犯的错误是每当我切换选项卡时都会创建 Fragment
的新实例,但我不知道如何修复它或从哪里开始
我看到有些人说在这种情况下应该使用 ViewPagerAdapter
,但我无法找到一个正确解释它的地方。
任何帮助将不胜感激!
这里有一篇文章,完美详细地描述了您的案例。
基本上,它为内存中的每个选项卡创建一个片段,并将它们保存为活动中的局部变量:
final Fragment fragment1 = new HomeFragment();
final Fragment fragment2 = new DashboardFragment();
final Fragment fragment3 = new NotificationsFragment();
final FragmentManager fm = getSupportFragmentManager();
Fragment active = fragment1;
您将所有 3 个片段添加到管理器,但隐藏其中 2 个,因此只有 1 个可见:
fm.beginTransaction().add(R.id.main_container, fragment3, "3").hide(fragment3).commit();
fm.beginTransaction().add(R.id.main_container, fragment2, "2").hide(fragment2).commit();
fm.beginTransaction().add(R.id.main_container,fragment1, "1").commit();
您实现
OnNavigationItemSelectedListener
的 BottomNavigationView
,检查哪个项目被按下,然后显示该片段,同时隐藏前一个片段:
case R.id.navigation_dashboard:
fm.beginTransaction().hide(active).show(fragment2).commit();
active = fragment2;
代替
replacing
片段,使用 add/remove
并创建一个添加和删除片段堆栈的机制,也不推荐,但为了问题起见,您可以创建一个单例片段,而不是使用 new
关键字所有选项卡均已更改,您可以查看pageOffSet
companion object{
private lateinit var INSTANCE?: HomeFragment() = null
}
fun getInstance(): HomeFragment(){
if(INSTANCE == null){
INSTANCE = HomeFragment()
}
return INSTANCE
}
众所周知,当我们使用
ViewPager
切换页面时,BottomNavigationView
会重新创建片段。我知道如何防止这种情况,请使用以下 2 个选项之一:
onCreate()
的 MainHomeActivity.java
:
mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(limit); //limit is a fixed integer
ViewPager
的一部分。 (链接中提供了示例)更新
在@moalzoabi 的例子中,第二个选项有效。按照这个帖子。
https://medium.com/p/865d084be817 您可以通过扩展 BottomNavagationView 来编写自定义视图。