使用 BottomBar 和片段容器禁用 Android 片段重新加载

Posted

技术标签:

【中文标题】使用 BottomBar 和片段容器禁用 Android 片段重新加载【英文标题】:Disable Android Fragment reloading with BottomBar and fragment container 【发布时间】:2016-11-24 08:37:43 【问题描述】:

好的,所以我正在构建一个使用 this library 进行底部导航的 android 应用程序,并且我正在使用一个基本 Activity 来保存它以及一个 Framelayout 来管理我的片段以进行加载/替换等。

有效的方法: 点击底部栏图标会加载它对应的片段并且效果很好。

我的问题: 如果我点击第一个选项卡,然后是第二个选项卡,然后是第一个选项卡AGAIN,整个片段会从头开始重新加载。

我不想要这种行为。 ALSO 使用底部栏库时,任何人都有关于如何保留片段状态的任何好的提示。

我在以前的应用程序中使用 pagerview 实现了类似的功能(以前的应用程序没有使用底栏进行导航),但我不确定如何将 pagerview 与 ONE 基本活动一起使用它包含用于替换片段的 Framelayout,或者这甚至是最好的解决方案。

我喜欢我目前拥有的解决方案,除了片段每次替换以前的片段时都从头开始重新加载。如果有人有任何可以帮助我的帮助或建议,将不胜感激。

【问题讨论】:

【参考方案1】:

好吧,我似乎暂时想出了一个解决办法。它在切换标签后保持片段状态,所以我很满意。

在承载片段容器的基本活动类中,我有以下内容

public class BaseActivity extends AppCompatActivity

    AFragment AFragment = new AFragment();
    BFragment BFragment = new BFragment();

    Fragment currentFragment;

    Boolean aIsActive = false;
    Boolean bIsActive = false;

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

        BottomBar bottomBar = BottomBar.attach(this, savedInstanceState);

        bottomBar.setItems(
                new BottomBarTab(null,"A"),
                new BottomBarTab(null,"B")
        );

        bottomBar.setDefaultTabPosition(0);

        bottomBar.setOnTabClickListener(new OnTabClickListener()
        
            @Override
            public void onTabSelected(int position)
            
                if (position == 0)
                
                    if(!aIsActive)
                    
                        getSupportFragmentManager().beginTransaction().add(R.id.fragmentContainer,AFragment).commit();
                        aIsActive = true;
                    
                    else
                    
                        getSupportFragmentManager().beginTransaction().hide(currentFragment).show(AFragment).commit();
                    

                    currentFragment = AFragment;
                
                else if(position == 1)
                
                    if(!bIsActive)
                    
                        getSupportFragmentManager().beginTransaction().add(R.id.fragmentContainer,BFragment).commit();
                        bIsActive = true;
                    
                    else
                    
                        getSupportFragmentManager().beginTransaction().hide(currentFragment).show(BFragment).commit();
                    

                    currentFragment = BFragment;
                
            

            @Override
            public void onTabReSelected(int position) 

            
        );

    


你瞧,它可以按预期工作而无需刷新片段 :) 任何建议或反馈,请让我知道并随时发表评论。

【讨论】:

这里的一个改进可能不是更好地维护 isActive 标志,而是为片段保留一个变量,并检查该变量是否为空。如果是这样,则意味着您必须创建片段,如果不是,则交换片段

以上是关于使用 BottomBar 和片段容器禁用 Android 片段重新加载的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以使用 SwiftUI 创建 BottomBar

iOS同时推送BottomBar和ToolBar

片段交易后如何禁用按钮?

从片段中禁用导航抽屉

Android Jetpack 导航禁用滚动位置

炫酷的底部菜单栏BottomBar