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

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

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

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

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

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

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

【问题讨论】:

    标签: android android-fragments navigation android-viewpager


    【解决方案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 标志,而是为片段保留一个变量,并检查该变量是否为空。如果是这样,则意味着您必须创建片段,如果不是,则交换片段
    猜你喜欢
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 2014-01-23
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多