Cambiar entre fragmentos en una sola actividad

Quiero crear una Activity que muestre una clase de menú que un usuario puede pasar. Al hacer clic en un elemento, se muestra una nueva pantalla, lo que permite al usuario más opciones (asistente-como).

Quería implementar esto usando Fragment s, pero no funciona para mí.
Ahora mismo tengo:

main.xml :

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/main_fragmentcontainer" > <fragment android:id="@+id/mainmenufragment" android:name="com.myapp.MainMenuFragment" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <fragment android:id="@+id/secondmenufragment" android:name="com.myapp.SecondMenuFragment" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> 

MainMenuFragment con un OnClickListener :

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.mainmenu, container, false); setupButton(view); return view; } /* Button setup code omitted */ @Override public void onClick(View v) { SherlockFragment secondRunMenuFragment = (SherlockFragment) getSherlockActivity().getSupportFragmentManager().findFragmentById(R.id.secondmenufragment); FragmentTransaction transaction = getSherlockActivity().getSupportFragmentManager().beginTransaction(); transaction.replace(android.R.id.content, secondMenuFragment); //also crashes with R.id.main_fragmentcontainer transaction.addToBackStack(null); transaction.commit(); } 

Ahora cuando presiono el botón, la aplicación se bloquea con este logcat:

06-27 01: 45: 26.309: E / AndroidRuntime (8747): java.lang.IllegalStateException: No se puede cambiar el ID del contenedor del fragmento SecondMenuFragment {405e2a70 # 1 id = 0x7f060029}: fue 2131099689 ahora 2131099687
06-27 01: 45: 26.309: E / AndroidRuntime (8747): en android.support.v4.app.BackStackRecord.doAddOp (Fuente desconocida)
06-27 01: 45: 26.309: E / AndroidRuntime (8747): en android.support.v4.app.BackStackRecord.replace (Fuente desconocida)
06-27 01: 45: 26.309: E / AndroidRuntime (8747): en android.support.v4.app.BackStackRecord.replace (Fuente desconocida)
06-27 01: 45: 26.309: E / AndroidRuntime (8747): en com.myapp.MainMenuFragment $ MyButtonOnClickListener.onClick (MainMenuFragment.java:52)

¿Qué estoy haciendo mal?

Personalmente, no tendría ningún elemento <fragment> .

Paso # 1: Llene su disposición de actividad con un <FrameLayout> para la pieza variable del asistente, más sus diversos botones.

Paso # 2: En onCreate() de la actividad, ejecute un FragmentTransaction para cargar la primera página del asistente en FrameLayout .

Paso # 3: En el "siguiente" clic, ejecute un FragmentTransaction para reemplazar el contenido del FrameLayout con la siguiente página del asistente.

Paso # 4: Añada las inteligencias adecuadas para desactivar los botones cuando no se puedan usar (por ejemplo, volver a la primera página del asistente).

También, usted querrá pensar en cómo el botón BACK debería funcionar en conjunto con cualquier botón "atrás" en la pantalla del asistente. Si desea que ambos se comporten de forma idéntica, tendrá que agregar cada transacción a la pila posterior y elementos pop de la pila trasera cuando maneje el botón "Atrás".

Algún día, si nadie me golpea, intentaré crear un ejemplo de un asistente-por-camino-de-fragmentos, o tal vez un componente reutilizable.

Creo este diseño principal:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" tools:context="com.example.fragmentsexample.MainActivity" > <FrameLayout android:id="@+id/contentFragment" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" /> </LinearLayout> 

Y me reponía en la FrameActivity con:

 @Override public void onCreate(Bundle savedInstanceState) { ... Fragment fragment = new Dashboard(); FragmentManager fm = getSupportFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); transaction.replace(R.id.contentFragment, fragment); transaction.commit(); ... } 

Y me repleace on onClick Method con el mismo código, cahnging Fragment (Dashboard for Events):

 @Override public void onClick.... { ... Fragment fragment = new Events(); FragmentManager fm = getSupportFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); transaction.replace(R.id.contentFragment, fragment); //Container -> R.id.contentFragment transaction.commit(); ... } 

Otra opción es usar el Android-WizardPager de Roman Nurik.

Características principales:

  • Ramificación o la posibilidad de que los pasos del asistente influyan en la disponibilidad de pasos posteriores
  • Permitir al usuario revisar antes de comprometerse
  • Permitir la navegación de forma libre del usuario entre pasos del asistente
  • Soporte para los pasos obligatorios y opcionales
  • Soporte para clases paso a paso (técnicamente, cada paso es una instancia de una clase Java, por lo que puede tener varias instancias dentro del asistente)

Más información aquí.

  • ¿Vincular servicio a FragmentActivity o Fragment?
  • Guardar y restaurar el estado de la interfaz de usuario del fragmento cuando se empuja y sale del backstack
  • Android Fragments recreado en el cambio de orientación
  • La actividad de NavigationDrawer está llena de fragmentos de retorno de llamada y lógica de aplicaciones
  • Pila trasera personalizada para cada fragmento en TabHost en Android
  • Obtención del error "La actividad Java.lang.IllegalStateException se ha destruido" al utilizar pestañas con ViewPager
  • El fragmento de diálogo omitido vuelve a aparecer cuando se reanuda la aplicación
  • Los datos estáticos guardados dentro de singleton son nulos a veces cuando se vuelve a la aplicación desde el fondo
  • Android: Fragmento no puede obtener actividad
  • No se puede resolver FragmentActivity ejecutándose en Android 2.3.3 con el paquete de compatibilidad v4
  • DateTimePicker android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.