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

6

好的,我正在构建一个使用这个库实现底部导航的安卓应用程序,我正在使用一个基础Activity来持有它,以及一个Framelayout来管理我的碎片以进行加载/替换等操作。

可以工作的是: 点击底部栏图标会加载对应的Fragment,它完美地工作了。

我的问题是: 如果我先点击第一个选项卡,然后点击第二个选项卡,再次点击第一个选项卡,整个Fragment都会重新从头开始加载。

我不想要这种行为。有没有人有关于如何在同时使用底部导航栏库时保留Fragment状态的好方法。

我以前的一个应用程序使用PagerView实现了类似的功能(之前的应用程序没有使用底部导航栏进行导航),但我不确定如何在仅使用一个基本Activity来持有FrameLayout来替换Fragment或者是否这是最佳解决方案。

我很喜欢目前的解决方案,除了每次替换以前的Fragment时都会重新加载Fragment这一点。如果有人能提供任何帮助或建议,将不胜感激。

1个回答

2

好的,我似乎找到了一个临时的解决方法。它在切换标签后保留了片段状态,所以我很满意。

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

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标志,而是为片段保留一个变量,并将该变量与null进行比较。如果是这样,那么您必须创建该片段,如果不是,则交换片段。 - Ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接