¿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:
- Disparar Evento táctil desde la vista DialogFragment a la vista de actividad principal
- Adaptar chrisbanes ActionBar-PullToRefresh a fragmentos (NavigationDrawer)
- Prácticas recomendadas para consultar la base de datos SQLite en ListFragment con CursorLoader?
- ¡Omitió 49 cuadros! La aplicación puede estar haciendo demasiado trabajo en su hilo principal
- Cómo poner Google Maps V2 en un fragmento con ViewPager
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.
- Obtener excepción IndexOutOfBoundsException FragmentManagerImpl después de compartir algo con las aplicaciones
- ¿Cómo volver de Unity Player a la anterior actividad de Android?
- ¿Cómo crear una lista desplegable dentro de un cajón de navegación (en Android)?
- Android SharedPreferences en Fragmento
- Google Maps Fragment no se carga
- Tratando de superponer un fragmento sobre un diseño existente
- Cómo deshabilitar la captura de pantalla en Android fragmento?
- Crear pestañas en SlidingTabLayout no deslizar
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)); }
- Cómo pasar una estructura como un argumento a la función java o volver a java de jni
- Extraño borde negro alrededor de XML extraíble android