如何在更改选项卡时停止片段重新加载?

问题描述 投票:0回答:4

我有一个

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
,但我无法找到一个正确解释它的地方。

任何帮助将不胜感激!

android android-fragments parse-platform android-fragmentactivity bottomnavigationview
4个回答
1
投票

这里有一篇文章,完美详细地描述了您的案例。

基本上,它为内存中的每个选项卡创建一个片段,并将它们保存为活动中的局部变量:

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;

0
投票

代替

 replacing
片段,使用
 add/remove
并创建一个添加和删除片段堆栈的机制,也不推荐,但为了问题起见,您可以创建一个单例片段,而不是使用
 new
关键字所有选项卡均已更改,您可以查看
pageOffSet

 companion object{
          private lateinit var INSTANCE?: HomeFragment() = null
    }

  fun getInstance(): HomeFragment(){
         if(INSTANCE == null){
            INSTANCE = HomeFragment()
          }
    return INSTANCE 
  }

0
投票

众所周知,当我们使用

ViewPager
切换页面时,
BottomNavigationView
会重新创建片段。我知道如何防止这种情况,请使用以下 2 个选项之一:

  1. 正如我所见,您的碎片数量很小且固定,请添加您的
    onCreate()

MainHomeActivity.java

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(limit);         //limit is a fixed integer
  1. 使用 FragmentPagerAdapter 作为
    ViewPager
    的一部分。 (链接中提供了示例)

更新

在@moalzoabi 的例子中,第二个选项有效。按照这个帖子


0
投票

https://medium.com/p/865d084be817 您可以通过扩展 BottomNavagationView 来编写自定义视图。

© www.soinside.com 2019 - 2024. All rights reserved.