简体   繁体   English

在BottomNavigationView中不重新创建片段

[英]not re-create fragment in BottomNavigationView

Problem: 问题:

Each time the BottomNavigationView is clicked the fragment is re-created. 每次单击BottomNavigationView时,都会重新创建该片段。

Currently in each fragment I have Recycler View that runs only once when creating the Fragment. 当前,在每个片段中,我都有Recycler View,该视图在创建片段时仅运行一次。

In this case, the RecyclerView data is loaded every time. 在这种情况下,每次都会加载RecyclerView数据。 And that's not what I'd like. 那不是我想要的。

How could I work so that the Fragment remains active after it is clicked the first time. 我该如何工作,以便在第一次单击该片段后仍保持活动状态。 And when you go back to the Fragment already created, just display it without recreating it every time? 当您回到已经创建的片段时,只显示它而不每次都重新创建它吗?

My attempts: 我的尝试:

BottomNavigationView bottomNavigationView =(BottomNavigationView) findViewById(R.id.bottomNavView_Bar);
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);

final Menu menu = bottomNavigationView.getMenu();
fragmentManager = getSupportFragmentManager();
final FragmentTransaction transaction = fragmentManager.beginTransaction();

/* Fragmento Start */
transaction.replace(R.id.content_home, new MainFragment()).commit();


bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        Intent in;
        Fragment fragment = null;
        Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.content_home);
        switch (item.getItemId()){

            case R.id.ic_home:

                if (!(currentFragment instanceof MainFragment)) {
                    fragment = new MainFragment();
                    toolbar.setTitle("Main");
                    item = menu.getItem(0);
                    item.setChecked(true);
                }

                break;

            case R.id.ic_categorias:

                if (!(currentFragment instanceof CategoriasFragment)) {
                    fragment = new CategoriasFragment();
                    toolbar.setTitle("Categorias");
                    item = menu.getItem(1);
                    item.setChecked(true);
                }
                break;



            case R.id.ic_calendar:

                if (!(currentFragment instanceof FeedUserFragment)) {
                    fragment = new FeedUserFragment();
                    item = menu.getItem(2);
                    toolbar.setTitle("Feed");
                    item.setChecked(true);
                }
                break;

            case R.id.ic_explore:

                if (!(currentFragment instanceof ExploreFragment)) {
                    fragment = new ExploreFragment();
                    item = menu.getItem(3);
                    toolbar.setTitle("Explorar");
                    item.setChecked(true);
                }
                break;

            case R.id.ic_person:

                if (!(currentFragment instanceof Opcoes)) {
                    fragment = new Opcoes();
                    toolbar.setTitle("Opções");
                    item = menu.getItem(4);
                    item.setChecked(true);
                }
                break;

        }

        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.replace(R.id.content_home, fragment);
        transaction.commit();

        return false;

    }
});

You are replacing your fragment every time ie after your switch block complete. 您每次都在替换片段,即在完成切换块之后。

Solution : Replace only when condition meets and use addToBackStack which helps to maintain stacks. 解决方案 :仅在条件满足时才更换,并使用有助于维护堆栈的addToBackStack You can read more about from this site 你可以阅读更多关于网站

Try this, 尝试这个,

bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        Intent in;
        Fragment fragment = null;
        Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.content_home);
        switch (item.getItemId()){

            case R.id.ic_home:

                if (!(currentFragment instanceof MainFragment)) {
                    fragment = new MainFragment();
                    toolbar.setTitle("Main");
                    item = menu.getItem(0);
                    item.setChecked(true);
                    loadFragment(fragment,"mainMenu");
                }

                break;

            case R.id.ic_categorias:

                if (!(currentFragment instanceof CategoriasFragment)) {
                    fragment = new CategoriasFragment();
                    toolbar.setTitle("Categorias");
                    item = menu.getItem(1);
                    item.setChecked(true);
                    loadFragment(fragment,"categories");
                }
                break;



            case R.id.ic_calendar:

                if (!(currentFragment instanceof FeedUserFragment)) {
                    fragment = new FeedUserFragment();
                    item = menu.getItem(2);
                    toolbar.setTitle("Feed");
                    item.setChecked(true);
                    loadFragment(fragment,"feedUsers");
                }
                break;

            case R.id.ic_explore:

                if (!(currentFragment instanceof ExploreFragment)) {
                    fragment = new ExploreFragment();
                    item = menu.getItem(3);
                    toolbar.setTitle("Explorar");
                    item.setChecked(true);
                    loadFragment(fragment,"explore");
                }
                break;

            case R.id.ic_person:

                if (!(currentFragment instanceof Opcoes)) {
                    fragment = new Opcoes();
                    toolbar.setTitle("Opções");
                    item = menu.getItem(4);
                    item.setChecked(true);
                    loadFragment(fragment,"opcoes");
                }
                break;

        }



        return false;

    }
});

/**
 * Create new method which replace your old fragment
 */
public void loadFragment(Fragment fragment, String tag){
            FragmentManager manager = getSupportFragmentManager();
            FragmentTransaction transaction = manager.beginTransaction();
            transaction.replace(R.id.content_home, fragment);
            transaction.addToBackStack(tag);
            transaction.commit();

}

I would try transaction.add() and search for fragments in back stack with this method findFragmentByTag . 我会尝试使用transaction.add()并使用findFragmentByTag方法在后堆栈中搜索片段。 https://developer.android.com/reference/android/support/v4/app/FragmentManager.html#findFragmentByTag(java.lang.String) . https://developer.android.com/reference/android/support/v4/app/FragmentManager.html#findFragmentByTag(java.lang.String)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM