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
0 Comentarios
para escribir tu comentario