4

Mostrar fragments con BottomNavigationView

Lograr que mi BottomNavigationView pudiera cambiar entre fragments como yo quería, fue algo complicado. Te muestro primero el código de mi ContainerActivity funcional, quizás te sirve para solventar:

publicclassContainerActivityextendsAppCompatActivity{

    privateboolean viewIsAtHome;

    @OverrideprotectedvoidonCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_container);

        BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottombar);

        bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @OverridepublicbooleanonNavigationItemSelected(@NonNull MenuItem menuItem){
                int itemId = menuItem.getItemId();
                switch (itemId){
                    case R.id.home:
                        addFragment(new HomeFragment());
                        viewIsAtHome = true;
                        break;
                    case R.id.profile:
                        addFragment(new ProfileFragment());
                        viewIsAtHome = false;
                        break;
                    case R.id.search:
                        addFragment(new SearchFragment());
                        viewIsAtHome = false;
                        break;
                }
                returntrue;
            }
        });

        bottomNavigationView.setSelectedItemId(R.id.home);
    }

    privatevoidaddFragment(Fragment fragment){
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.fragment_container, fragment)
                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
                .addToBackStack(null)
                .commit();
    }

    @OverridepublicvoidonBackPressed(){
        if (!viewIsAtHome) { //if the current view is not the News fragment
            BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottombar);
            bottomNavigationView.setSelectedItemId(R.id.home); //display the News fragment
        } else {
            moveTaskToBack(true);  //If view is in News fragment, exit application
        }
    }
}

Mostrando fragments con el BottomNavigationView

  • En primer lugar, es necesario crear un objeto de la clase BottomNavigationView en el método onCreate(), y relacionarlo con id de nuestro elemento:
BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottombar);
  • En segundo lugar, fuera del método onCreate() debemos crear un método que será llamado por una acción y se encargará de reemplazar el contenido actual del container por el fragment que le enviarémos como parámetro:
privatevoidaddFragment(Fragment fragment){
    getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.fragment_container, fragment)
            .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
            .addToBackStack(null)
            .commit();
}
  • Luego tenemos que definir un Listener, dentro del método onCreate(), bajo el objeto que creamos previamente, que estará constantemente “escuchando” cualquier cambio en nuestro bottomNavigationView y cuando se seleccione un item del menú, mostrará el fragment correspondiente con el método addFragment():
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @OverridepublicbooleanonNavigationItemSelected(@NonNull MenuItem menuItem){
                int itemId = menuItem.getItemId();
                switch (itemId){
                    case R.id.home:
                        addFragment(new HomeFragment());
                        break;
                    case R.id.profile:
                        addFragment(new ProfileFragment());
                        break;
                    case R.id.search:
                        addFragment(new SearchFragment());
                        break;
                }
                returntrue;
            }
        });
  • Por último, si quieres que tan pronto se cree la Activity, el fragment home se muestre por defecto, deberías agregar lo siguiente, luego del Listener en el método onCreate().
bottomNavigationView.setSelectedItemId(R.id.home);

Controlar comportamiento del botón Back

Si quieres hacer que el botón back te mande a fragment home, puedes hacer lo siguiente:

  • Declara la siguiente variable (yo lo hice antes del método onCreate() ):
privateboolean viewIsAtHome;
  • Luego, antes del break; en cada case del método onNavigationItemSelected() deberías agregar lo siguiente (PERO en el case del home, esta variable será TRUE) :
viewIsAtHome = false;
  • Debería quedar de la siguiente manera :
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
    @OverridepublicbooleanonNavigationItemSelected(@NonNull MenuItem menuItem){
        int itemId = menuItem.getItemId();
        switch (itemId){
            case R.id.home:
                addFragment(new HomeFragment());
                viewIsAtHome = true;
                break;
            case R.id.profile:
                addFragment(new ProfileFragment());
                viewIsAtHome = false;
                break;
            case R.id.search:
                addFragment(new SearchFragment());
                viewIsAtHome = false;
                break;
        }
        returntrue;
    }
});
  • Para finalizar, escribe un nuevo método onBackPressed fuera del onCreate() :
@Override
    public void onBackPressed() {
        if (!viewIsAtHome) { //Si la vista actual no es el fragment Home
            BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottombar);
bottomNavigationView.setSelectedItemId(R.id.home); //Selecciona el fragment Home
        } else {
            moveTaskToBack(true);  //Si presionas Back cuando ya muestras el fragment Home, sale de la app
        }
    }
Escribe tu comentario
+ 2
Ordenar por:
1
3Puntos

Buenas, si el HomeFragment es mi MainActivity como lo hago para volver de un fragment al MAIN? gracias