Viewpager en el fragmento no se muestra (restaurado) cuando vuelve de otro fragmento

Estoy frente al problema de la siguiente manera: En la pantalla principal, tengo 3 botones: Config, Main, Configuración.

  • Cuando se hace clic en cada botón, se mostrará un fragmento correspondiente para inflar el diseño en FrameLayout.
  • Cuando el usuario está en Config o Fragmento de Configuración, puede volver al Fragmento principal utilizando el botón de presión o pulsar sobre el botón Principal. Cuando el usuario está en Fragmento Principal, si el usuario hace clic en Atrás, se mostrará una ventana emergente para confirmar la salida.

En el fragmento principal, pongo un viewpager. Dentro de este viewpager, puse 2 otros fragmentos, cada uno de ellos contiene una rejilla de imágenes (yo también utilicé un indicador del círculo para ver los cambios de la página en el fondo). Por simplicidad, Fragmento de configuración y Fragmento de configuración sólo muestran un Texto en el centro. Cuando el inicio de la aplicación, en mostró normalmente fragmento principal, cuando hago clic en el botón Configuración o Config, mostró normalmente fragmentos correspondientes. El problema es cuando haga clic en el botón Atrás (en Android), regresa al Fragmento Principal pero sin fragmentos dentro de viewpager. Mostraba una pantalla vacía.

El fragmento principal - fragmento 1 en viewpager se muestraFragmento principal - el fragmento 2 en viewpager se muestraFragmento de configuraciónFragmento de configuraciónVolver al fragmento principal del fragmento config / setting

Tal vez estoy equivocado cuando el proceso de volver de config / setting fragmento de fragmento principal. Si el fragmento principal acaba de inflar un cierto diseño sin viewpager, el problema no sucederá. ¿Cómo restaurar el estado del viewpager cuando vuelve al fragmento principal del fragmento config / setting? Estoy adjuntando mi código para que pueda darme una respuesta más clara. Muchas gracias por cualquier respuesta.

package com.example.testfragmentviewpager; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.Window; import android.widget.Button; import android.widget.FrameLayout; import com.example.viewpageindicator.CirclePageIndicator; import com.example.viewpageindicator.PageIndicator; public class MainActivity extends FragmentActivity { Fragment configFragment; Fragment settingFragment; Fragment mainItemsFragment; FrameLayout frmLayout; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); if (savedInstanceState == null) { FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); frmLayout = (FrameLayout) findViewById(R.id.frame_cotainer); mainItemsFragment = new MainItemsFragment(); ft.add(R.id.frame_cotainer, mainItemsFragment, "mainItems").commit(); } addListener(R.id.btnConfig); addListener(R.id.btnMain); addListener(R.id.btnSetting); } public void addListener(int buttonID) { final Button btn = (Button) findViewById(buttonID); btn.setOnClickListener(new OnClickListener() { public void onClick(View v) { showFragment(btn); } }); } public void showFragment(View v) { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); switch (v.getId()) { case R.id.btnConfig: if (configFragment == null) { configFragment = new ConfigListFragment(); } else if (configFragment.isVisible()) return; if (getCurrentEntriesInBackStack() == 0) { ft.addToBackStack("mainItems"); } ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); ft.replace(R.id.frame_cotainer, configFragment, "config"); break; case R.id.btnMain: if (mainItemsFragment == null) mainItemsFragment = new MainItemsFragment(); if (getCurrentEntriesInBackStack() == 0) return; else { if (configFragment != null && configFragment.isVisible()) { ft.detach(configFragment); configFragment = null; } if (settingFragment != null && settingFragment.isVisible()) { ft.detach(settingFragment); settingFragment = null; } ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); removeFromContainer(ft); callPopBackStack(); return; } case R.id.btnSetting: if (settingFragment == null) settingFragment = new SettingFragment(); else if (settingFragment.isVisible()) return; if (getCurrentEntriesInBackStack() == 0) { ft.addToBackStack("mainItems"); } ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); ft.replace(R.id.frame_cotainer, settingFragment, "setting"); break; default: break; } ft.commit(); } private int getCurrentEntriesInBackStack() { FragmentManager fm = getSupportFragmentManager(); return fm.getBackStackEntryCount(); } private boolean callPopBackStack() { FragmentManager fm = getSupportFragmentManager(); boolean result = fm.popBackStackImmediate(); return result; } private void removeFromContainer(FragmentTransaction ft) { if (configFragment != null && configFragment.isVisible()) { ft.detach(configFragment); configFragment = null; } if (settingFragment != null && settingFragment.isVisible()) { ft.detach(settingFragment); settingFragment = null; } ft.commit(); } public static class ConfigListFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.layout_config, container, false); return v; } } public static class SettingFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.layout_setting, container, false); return v; } } public static class MainItemsFragment extends Fragment { private MyPagerAdapter adapter; private ViewPager viewpager; private PageIndicator mIndicator; View rootView; private class setAdapterTask extends AsyncTask<Void, Void, Void> { protected Void doInBackground(Void... params) { return null; } @Override protected void onPostExecute(Void result) { viewpager.setAdapter(adapter); mIndicator = (CirclePageIndicator) rootView.findViewById(R.id.indicator); mIndicator.setViewPager(viewpager); viewpager.setCurrentItem(0); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { rootView = inflater.inflate(R.layout.mainscreen_layout, container, false); adapter = new MyPagerAdapter(getFragmentManager()); viewpager = (ViewPager) rootView.findViewById(R.id.myviewpager); new setAdapterTask().execute(); return rootView; } } public static class MyPagerAdapter extends FragmentPagerAdapter { public MyPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int index) { if (index == 0) { return new MainFragment1(); } else { return new MainFragment2(); } } @Override public int getCount() { return 2; } } @Override public void onBackPressed() { FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); removeFromContainer(ft); if (fm.popBackStackImmediate()) { return; } else { AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this); dlg.setTitle("Confirm Exit"); dlg.setMessage("Do you want to exit?").setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { MainActivity.this.finish(); } }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); AlertDialog alertDlg = dlg.create(); alertDlg.show(); } } } 

Parece que estás usando uno de los hacks antiguos para incrustar fragmentos. Sugiero que primero actualice a la última biblioteca de soporte de Android, es decir. Versión 11. A continuación, eche un vistazo a cómo utilizar el Child FragmentManager http://developer.android.com/reference/android/support/v4/app/Fragment.html#getChildFragmentManager ()

Tengo un ejemplo en github sobre cómo anidar fragmentos con un viewpager.
https://github.com/marsucsb/nested-fragments

  • ¿Cómo evitar que una vista de desplazamiento se desplace a una vista web después de cargar los datos?
  • ViewPager con Fragmentos dentro de PopupWindow (o DialogFragment) - Error no se encontró ninguna vista para id para el fragmento
  • Fragmento de actualización de Android ViewPager
  • Android: Debería agregar un constructor vacío a un fragmento utilizado en ViewPager
  • Flip imágenes en un viewpager
  • ViewPager y base de datos
  • ViewPager omitir las vistas de devolución dejando en blanco
  • Guardar estado de fragmento en ViewPager
  • Viewpager en fragmento no se actualiza al navegar de nuevo a fragmento
  • ViewPager FragmentPagerAdapter Nullpointer
  • PagerTabStrip tabs alineación a la izquierda
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.