Curso Definitivo de Android 2016

Toma las primeras clases gratis

COMPARTE ESTE ARTÍCULO Y MUESTRA LO QUE APRENDISTE

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:

public class ContainerActivity extends AppCompatActivity {

    private boolean viewIsAtHome;

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

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

        bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@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;
                }
                return true;
            }
        });

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

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

    @Override
    public void onBackPressed() {
        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:
private void addFragment(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() {
            @Override
            public boolean onNavigationItemSelected(@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;
                }
                return true;
            }
        });
  • 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() ):
private boolean 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() {
    @Override
    public boolean onNavigationItemSelected(@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;
        }
        return true;
    }
});
  • 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
        }
    }

Curso Definitivo de Android 2016

Toma las primeras clases gratis

COMPARTE ESTE ARTÍCULO Y MUESTRA LO QUE APRENDISTE

0 Comentarios

para escribir tu comentario

Artículos relacionados