Creé un nuevo proyecto con la "Actividad de navegación inferior":
Este es el código generado:
package com.aaron.waller.mrpolitik; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.design.widget.BottomNavigationView; import android.support.v7.app.AppCompatActivity; import android.view.MenuItem; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private TextView mTextMessage; private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener = new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { case R.id.navigation_home: mTextMessage.setText(R.string.title_home); case R.id.navigation_dashboard: mTextMessage.setText(R.string.title_dashboard); case R.id.navigation_notifications: mTextMessage.setText(R.string.title_notifications); } return true; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextMessage = (TextView) findViewById(R.id.message); BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation); navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); } }¿Cómo puedo cambiar a nuevos fragmentos con la barra inferior? Por ejemplo, tengo 3 fragmentos: Fragment1 Fragment2 y Fragment3 y quiero cambiarlos con los 3 botones de la barra inferior. También quiero poder cambiar los Fragmentos deslizando mi dedo hacia la izquierda y hacia la derecha, ¿cómo puedo hacer eso?
La forma en que lo haría es, primero agregaría tres métodos similares a este (cada uno para un solo fragmento. Reemplace el nombre del diseño y el objeto del fragmento al fragmento apropiado al que se está cambiando):
public void switchToFragment1() { FragmentManager manager = getSupportFragmentManager(); manager.beginTransaction().replace(R.id.your_fragment_layout_name, new Fragment1()).commit(); }Entonces, su declaración de cambio terminaría luciendo así:
switch (item.getItemId()) { case R.id.navigation_home: mTextMessage.setText(R.string.title_home); switchToFragment1(); break; case R.id.navigation_dashboard: mTextMessage.setText(R.string.title_dashboard); switchToFragment2(); break; case R.id.navigation_notifications: mTextMessage.setText(R.string.title_notifications); switchToFragment3(); break; }En cuanto a cambiar los fragmentos deslizando hacia los lados, creo que necesitarías un ViewPager .
Es bastante "sencillo".
FragmentA , FragmentB y FragmentC con FragmentA siendo el primer Fragmento que queremos en BottomNavigationView. En su Actividad, vaya al método onNavigationItemSelected y cambie el contenido a esto:
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener = new BottomNavigationView.OnNavigationItemSelectedListener(){ @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { case R.id.frag_a: currentFragment = new FragmentA(); ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.content, currentFragment); ft.commit(); return true; case R.id.frag_b: currentFragment = new FragmentB(); ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.content, currentFragment); ft.commit(); return true; case R.id.frag_c: currentFragment = new FragmentC(); ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.content, currentFragment); ft.commit(); return true; } return false; } }; En su método onCreate() , haga esto:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_client_profile); ft = getSupportFragmentManager().beginTransaction(); currentFragment = new FragmentA(); ft.replace(R.id.content, currentFragment); ft.commit(); BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation); navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); } Si no agrega FragmentA en onCreate() , la actividad estará en blanco cuando la inicie por primera vez.
Si se pregunta a qué se refiere R.id.content , es el Id del Framelayout en el diseño de su actividad. Inicialmente contiene un TextView , elimine el TextView para que se vea así:
<FrameLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"/> Finalmente, ft y currentFragment se definen así:
Fragment currentFragment = null; FragmentTransaction ft;No estoy seguro de la elegancia, pero esto funciona.
La mejor manera es usar un ViewPager con un FragmentPagerAdapter . Ya que cobra los fragmentos en su interior. Use setOnNavigationItemSelectedListener con BottomNavigationView para escuchar los clics del usuario. Y use viewPager.setCurrentItem(..) para moverse entre páginas.
Crear un nuevo fragmento cada vez que el usuario hace clic en un elemento en la vista de navegación inferior no es una buena solución (especialmente cuando el usuario hace clic en el elemento de la pantalla en el que se encuentra actualmente, la solución anterior creará un nuevo fragmento incluso para este caso)