Restauración del estado del fragmento al cambiar fragmentos a través de la barra de navegación inferior

Tengo la barra inferior de la navegación en el tecleo del artículo en la barra de la navegación estoy substituyendo fragmentos. Tengo 3 fragmentos A, B, C por lo que el clic de b elemento B fragmento se carga y en B estoy llamando 3-4 APIs. Así que ahora si voy a C y luego de nuevo a B una nueva instancia de B Fragmento se crea y de nuevo los API se llaman ¿cómo puedo guardar el fragmento de estado de la instancia y no llamar a las API de nuevo mientras se cambian los fragmentos. Este es mi código.

mBottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { int id = item.getItemId(); Fragment currentLoaded = fgMan.findFragmentById(R.id.container_body); switch (id) { case R.id.nearby_fragment: if (!(currentLoaded instanceof SpotFeedMapFragment)) { removeScroll(); mNearByFragment = fgMan.findFragmentByTag(NEARBY_FRAGMENT_TAG) != null ? fgMan.findFragmentByTag(NEARBY_FRAGMENT_TAG) : mNearByFragment; fgMan.beginTransaction().setCustomAnimations(R.anim.abc_fade_in, R.anim.abc_fade_out); fgMan.beginTransaction().replace(R.id.container_body, mNearByFragment, NEARBY_FRAGMENT_TAG).commit(); fgMan.executePendingTransactions(); getSupportActionBar().setTitle(getString(R.string.nearby_fragment)); } break; case R.id.route_fragment: if (!(currentLoaded instanceof BusLocationsFragment)) { if (!inParent) { mRl.removeView(fixLayout); p.addRule(RelativeLayout.BELOW, toolbar.getId()); scrollView.setLayoutParams(p); scrollView.addView(fixLayout); mRl.addView(scrollView); inParent = true; } //mFragment = new BusLocationsFragment(); mBusLocFragment = fgMan.findFragmentByTag(BUS_LOC_FRAGMENT_TAG) != null ? fgMan.findFragmentByTag(BUS_LOC_FRAGMENT_TAG) : mBusLocFragment; fgMan.beginTransaction().setCustomAnimations(R.anim.abc_fade_in, R.anim.abc_fade_out); fgMan.beginTransaction().replace(R.id.container_body, mBusLocFragment, BUS_LOC_FRAGMENT_TAG).commit(); fgMan.executePendingTransactions(); getSupportActionBar().setTitle(getString(R.string.app_name)); } break; case R.id.newsfeed_activity: if (!(currentLoaded instanceof NewsFeedActivity)) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1) { removeScroll(); } mNewsFeedFragment = fgMan.findFragmentByTag(NEWSFEED_FRAGMENT_TAG) != null ? fgMan.findFragmentByTag(NEWSFEED_FRAGMENT_TAG) : mNewsFeedFragment; fgMan.beginTransaction().setCustomAnimations(R.anim.abc_fade_in, R.anim.abc_fade_out); fgMan.beginTransaction().replace(R.id.container_body, mNewsFeedFragment, NEWSFEED_FRAGMENT_TAG).commit(); fgMan.executePendingTransactions(); getSupportActionBar().setTitle(getString(R.string.news)); } break; } return true; } }); 

Ya he inicializado fragmentos de las variables de miembro de arriba en onCreate de MainActivity

Utilicé la bottom navigation bar y lo hice personalizando viewpager y deshabilitar la navegación de deslizamiento. Cada vez que el usuario hace clic en el elemento inferior, establezca el fragmento relevante en viewpager. Estado del control de Viewpager del fragmento, así que ningún estado del control de la necesidad.

ViewPage personalizado como este

 public class BottomNavigationViewPager extends ViewPager { private boolean enabled; public AHBottomNavigationViewPager(Context context, AttributeSet attrs) { super(context, attrs); this.enabled = false; } @Override public boolean onTouchEvent(MotionEvent event) { if (this.enabled) { return super.onTouchEvent(event); } return false; } @Override public boolean onInterceptTouchEvent(MotionEvent event) { if (this.enabled) { return super.onInterceptTouchEvent(event); } return false; } /** * Enable or disable the swipe navigation * @param enabled */ public void setPagingEnabled(boolean enabled) { this.enabled = enabled; } } 

Si todavía desea controlar el estado de fragmento, puede ver mi respuesta en este enlace ¿Cómo guardar estado de fragmento en android?

Debe utilizar un FragmentPagerAdapter para iniciar los fragemnts, así que cuando desee cambiar entre ellos, se guardará el estado de los fragmentos.

 CutomViewPager viewPager = (CustomViewPager) findViewById(R.id.viewpager1); FragmentPagerAdapter adapter = new FragmentPagerAdapter (MainActivity.this.getSupportFragmentManager()); adapter.addFragment(new SpotFeedMapFragment(), "title"); adapter.addFragment(new BusLocationsFragment(), "title"); adapter.addFragment(new NewsFeedActivity(), "title"); viewPager.setAdapter(adapter); 

Entonces en la navegación inferior seleccionada puede establecer el fragmento por simple comando

 viewPager.setCurrentItem(n); 

Mi clase viewpager es la siguiente:

 public class CustomViewPager extends ViewPager { private boolean isPagingEnabled; public CustomViewPager(Context context) { super(context); this.isPagingEnabled = true; } public CustomViewPager(Context context, AttributeSet attrs) { super(context, attrs); this.isPagingEnabled = true; } @Override public boolean onTouchEvent(MotionEvent event) { return this.isPagingEnabled && super.onTouchEvent(event); } //for samsung phones to prevent tab switching keys to show on keyboard @Override public boolean executeKeyEvent(KeyEvent event) { return isPagingEnabled && super.executeKeyEvent(event); } @Override public boolean onInterceptTouchEvent(MotionEvent event) { return this.isPagingEnabled && super.onInterceptTouchEvent(event); } public void setPagingEnabled(boolean enabled) { this.isPagingEnabled = enabled; } } 

En el xml en lugar de un diseño vacío para fragemnt u necesidad:

 <com.package.util.CustomViewPager android:id="@+id/viewpager1" android:layout_width="match_parent" android:layout_height="match_parent" /> 

La solución más simple para eso es anular el método "OnCreate ()" en su Fragmento B y llamarle APIs en el método "OnCreate ()" en lugar de "OnCreateView ()".

Espero que funcione para usted!

  • Botón ActionBar del cajón de navegación no funciona
  • Barra de Acción de Android botón de navegación hacia arriba no funciona en los dispositivos
  • Posibilidad de una aplicación de navegación de orientación de turn by turn en tiempo real usando MapQuest en Android?
  • Explique los diferentes tipos de navegación, Android
  • Acceso al texto de dirección de giro a giro desde la navegación de google
  • ¿Cómo volver de Unity Player a la anterior actividad de Android?
  • Cajón de navegación de Android sobre las pestañas
  • La barra de navegación suave inferior se superpone a mi ListView
  • Obtener el icono de navegación de la barra de herramientas
  • Cómo configurar varias actividades de los padres para usar el botón de retroceso de Android
  • Cajón de navegación coexistente y diseño de panel deslizante
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.