¿Cómo es que la información de posición no se está pasando a mis fragmentos?

Tengo una Activity que es en gran parte sin modificar el ejemplo predeterminado de Android Studio para una actividad con pestañas. Su FragmentPagerAdapter se modifica para mostrar todos los 50 Estados Unidos, con 50 pestañas correspondientes que muestran sus nombres. Esto funciona hasta que se destruye un fragmento, pero cuando se vuelve a crear, no se dice en qué ficha está. ¿Por qué pasó esto?

Los siguientes son todos los métodos que creo que podrían ser parte del problema:

 public class MainQuizActivity extends Activity implements ActionBar.TabListener { ... public class SectionsPagerAdapter extends FragmentPagerAdapter { ... @Override public Fragment getItem(int position) { // getItem is called to instantiate the fragment for the given page. // Return a PlaceholderFragment (defined as a static inner class below). return questionFragments[position] == null ? questionFragments[position] = QuestionFragment.newInstance(position) : questionFragments[position]; } ... } ... } ... public class QuestionFragment extends Fragment { ... public static QuestionFragment newInstance(int stateIndex) { System.out.println("Creating new instance for state #" + stateIndex); QuestionFragment fragment = new QuestionFragment(); Bundle args = new Bundle(); args.putInt(States.BUNDLE_KEY, stateIndex); fragment.setArguments(args); return fragment; } ... @Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { System.out.println("~onCreateView"); View rootView = inflater.inflate( R.layout.fragment_main_quiz, container, false); webView = (WebView)rootView.findViewById(R.id.webView); initState(savedInstanceState); return rootView; } private void initState(Bundle args) { if (state == null) { System.out.println("Bundle: " + args); if (args == null) args = getArguments(); System.out.println("Bundle is now: " + args); int stateIndex = args.getInt(States.BUNDLE_KEY); System.out.println("Gonna be state #" + stateIndex); state = States.values()[stateIndex]; System.out.println("Gonna be " + state); } else System.out.println("State already exists! (yay!)"); String path = state.getImageURL(); System.out.println("Opening image at " + path); webView.loadUrl(path); webView.setBackgroundColor(0x00000000); } @Override public void onCreate(Bundle savedInstanceState) { System.out.println("~onCreate"); super.onCreate(savedInstanceState); if (webView == null) webView = (WebView)(getActivity().findViewById(R.id.webView)); System.out.println("onCreate: webView == " + webView); System.out.println("onCreate: bundle == " + savedInstanceState); if (webView != null && savedInstanceState != null) initState(savedInstanceState); } ... } 

He guardado esto en el paquete con la clave States.BUNDLE_KEY (que es "STATE" ), pero el paquete que se da no tiene esa clave en la segunda vez. Para propósitos de depuración, anulé todos los métodos on* que se ocupan de la carga y descarga con los vacíos como:

 @Override public void onResume(){ System.out.println("~onResume"); super.onResume();} 

Por supuesto, también hay más salidas de depuración que he lanzado.

Espero que este video que grabé ayuda a ilustrar el problema: http://youtu.be/cmbR_2rvpX4

El volcado de la consola para el video está en esta pasta: http://pastebin.com/rxAP7qda

Y, si todo esto todavía no ayuda, aquí está su git : https://github.com/Supuhstar/US-State-Quiz-App


Incluso después de todo esto, siento que no estoy dando la información correcta. Por favor, pregunte por menos o más si usted piensa que esto puede ser mejor.

No estás inicializando las cosas correctamente en tu QuestionFragment . En primer lugar no hay necesidad de llamar a initState(savedInstanceState); En las devoluciones de llamada onCreate() y onCreateView() . Llámelo en onCreateView() y quite completamente el método onCreate() :

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { System.out.println("~onCreateView"); View rootView = inflater.inflate(R.layout.fragment_main_quiz, container, false); webView = (WebView)rootView.findViewById(R.id.webView); guessSpinner = (Spinner)getActivity().findViewById(R.id.guess_spinner); initState(); initGuesser(); return rootView; } 

Su initState(savedInstanceState) también es un poco demasiado complicado para lo que debe hacer:

 private void initState() { Bundle args = getArguments(); if (args == null) { throw new IllegalArgumentException("The arguments should be valid!"); } System.out.println("Bundle is now: " + args); int stateIndex = args.getInt(States.BUNDLE_KEY); System.out.println("Gonna be state #" + stateIndex); state = States.values()[stateIndex]; System.out.println("Gonna be " + state); String path = state.getImageURL(); System.out.println("Opening image at " + path); webView.loadUrl(path); webView.setBackgroundColor(getResources().getColor(R.color.transparent)); } 
  • ActionBar-PullToRefresh con ListView y Fragmento
  • GetMapAsync () en el fragmento
  • Se necesita la guía compleja de diseño de la interfaz de usuario de Android (fragmentos)
  • ExpandableListView en Fragmento
  • Tablaturas de Android ActionBar - Pase
  • Cómo obtener el fragmento seleccionado
  • Error al inflacionar la clase android.support.design.widget.CoordinatorLayout y ClassNotFoundException: android.support.design.R $ styleable
  • Android que consigue el fragmento que está en FragmentPagerAdapter
  • Cómo obtener fragmentos existentes cuando se utiliza FragmentPagerAdapter
  • Usando secciones con fragmentos, NullPointerException
  • ¿Cómo cambia el fondo al iniciar sesión en la aplicación Instagram?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.