使用底部导航栏防止片段刷新

Posted

技术标签:

【中文标题】使用底部导航栏防止片段刷新【英文标题】:Prevent fragment refreshing with bottom navbar 【发布时间】:2019-10-27 05:30:06 【问题描述】:

我有以下底部导航栏代码在 3 个片段之间切换:

public class MainActivity extends AppCompatActivity 

    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
            = new BottomNavigationView.OnNavigationItemSelectedListener() 

        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) 
            Fragment fragment = null;

            switch (item.getItemId()) 
                case R.id.navigation_home:
                    fragment = new HomeFragment();
                    break;

                case R.id.navigation_dashboard:
                    fragment = new DashboardFragment();
                    break;

                case R.id.navigation_notifications:
                    fragment = new NotificationsFragment();
                    break;

            

            return loadFragment(fragment);
        

    ;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        loadFragment(new HomeFragment());


        BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
    

    private boolean loadFragment(Fragment fragment) 
        //switching fragment
        if (fragment != null) 
            getSupportFragmentManager()
                    .beginTransaction()
                    .replace(R.id.fragment_container, fragment)
                    .commit();
            return true;
        
        return false;
    

在片段中有带列表的 RecyclerViews。每次我在选项卡之间(片段之间)切换时,看起来片段被重新加载,并且列表跳到顶部。我想防止重新加载,以便用户在切换片段之前留在他查看的列表中的同一位置

【问题讨论】:

这是我在 *** ***.com/a/50939140/7655085找到的可行解决方案 【参考方案1】:

问题是您每次都在创建一个新实例。您可以像这样缓存实例:

    private Fragment mHomeFragment = new HomeFragment();
    private Fragment mDashboardFragment = new DashboardFragment();
    private Fragment mNotificationsFragment = new NotificationsFragment();


    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) 
        Fragment fragment = null;

        switch (item.getItemId()) 
            case R.id.navigation_home:
                fragment = mHomeFragment;
                break;

            case R.id.navigation_dashboard:
                fragment = mDashboardFragment;
                break;

            case R.id.navigation_notifications:
                fragment = mNotificationsFragment;
                break;

        

        return loadFragment(fragment);
    

【讨论】:

你能告诉我上面代码中缓存fragment的语句在哪里吗? 在创建字段时正在创建实例,在您的情况下,每次调用 onNavigationItemSelected 时都会创建实例。【参考方案2】:

正如我们所见,当您点击底部导航时,您总是会替换您的片段,替换意味着删除之前的片段并清除状态。解决方案是不要每次都创建片段并使用附加/分离方法来显示实际片段。 Here is already described 关于这些方法。

【讨论】:

以上是关于使用底部导航栏防止片段刷新的主要内容,如果未能解决你的问题,请参考以下文章

底部导航栏的 Oncreate 视图问题

在底部导航栏中保存片段状态

通过底部导航栏更改片段时恢复片段状态

带有片段和底部导航栏的 Android FloatingActionButton

如果在底部导航栏中选择了其他项目,如何删除 floatingActionButton 替换片段

底部导航图标不变