2012-06-26 10 views
10

Quiero crear un Activity que muestra una especie de menú por el que un usuario puede pasar. Al hacer clic en un elemento, se muestra una nueva pantalla, que permite al usuario más opciones (similar a un asistente).Alternar entre fragmentos en una sola actividad

que quería implementar esto usando Fragment s, pero que 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 se presiona 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 la ID del contenedor del fragmento SecondMenuFragment {405e2a70 # 1 id = 0x7f060029}: era 2131099689 ahora 2131099687
06-27 01: 45: 26.309: E/AndroidRuntime (8747): en android.support.v4.app.BackStackRecord.doAddOp (origen desconocido)
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?

+0

[Hay una pregunta similar aquí] (http://stackoverflow.com/questions/9092048/swap-two-fragment- simultáneamente) – adneal

+0

Si está intentando crear un asistente, ¿para qué sirve el segundo ''? – CommonsWare

+0

He visto esos enlaces, pero no sé cómo aplicarlos en mi caso. – nhaarman

Respuesta

14

En lo personal, yo no tendría ningún <fragment> elementos.

Paso # 1: Llenar su diseño de la actividad con un <FrameLayout> para la pieza variable del asistente, además de sus diferentes botones.

Paso # 2: en onCreate() de la actividad, ejecute 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 página siguiente del asistente.

Paso # 4: Añadir en la inteligencia apropiados para deshabilitar los botones cuando están inutilizables (por ejemplo, de vuelta en la primera página del asistente).

Además, tendrá que pensar en cómo el botón BACK debe trabajar en conjunto con cualquier botón en pantalla "atrás" en el asistente. Si desea que ambos se comporten de forma idéntica, deberá agregar cada transacción a la pila posterior y sacar cosas de la pila posterior cuando maneje el botón "Atrás".

Algún día, si nadie me pega a él, voy a tratar de crear un asistente-por-way-of-fragmentos ejemplo, o tal vez un componente reutilizable.

+0

No estoy seguro de si te entendí bien, pero lo hice funcionar de alguna manera. He puesto un '' vacío en mi archivo de diseño de actividad. Luego, en 'onCreate()' de la actividad, llamé a 'FragmentTransaction.add()' para agregar 'nuevo MainMenuFragment()' a 'R.id.main_fragmentcontainer', el id del' '. En el 'MainMenuFragment'' onClick() 'creo un' nuevo SecondMenuFragment() ', y lo agrego de la misma manera, otra vez a' R.id.main_fragmentcontainer'. Eso al menos funciona. Estoy especialmente confundido en el paso 1 _sus varios botones_. ¿Qué quieres decir con eso? ¿Y no podría simplemente usar 'LinearLayout'? – nhaarman

+0

@Niek: "¿Qué quieres decir con eso?" - por lo general, una interfaz de asistente tiene los botones "anterior" (o "posterior") y "siguiente". No hay ninguna razón para incluirlos en los fragmentos, ya que permanecen iguales a lo largo de todos los pasos del asistente, así que supongo que los pondría directamente en la actividad. "¿Y no podría simplemente usar LinearLayout?" -- ¿para qué? – CommonsWare

+0

Oh esos botones, pensé que querías decir mis botones de menú. Y sugirió un FrameLayout en el paso 1, pero creo que tiene que ver con la superposición de los botones "siguiente" y "anterior". ¡Gracias por tu ayuda! – nhaarman

12

puedo crear 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 i repone en el 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 repleace en onClick método con el mismo código, cahnging Fragmento (Tablero de instrumentos para Eventos) :

@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(); 
    ... 
} 
0

Otra opción es utilizar el Android-WizardPager de Roman Nuri k.

características clave:

  • ramificación, o la capacidad de pasos del asistente para influir en la disponibilidad de los últimos pasos de
  • Permitir al usuario revisar antes de comprometerse
  • Permitir que la navegación de forma libre por el usuario entre pasos del asistente
  • Soporte para los pasos requeridos y opcionales
  • Soporte para clases de pasos (técnicamente, cada paso es una instancia de Java c muchacha, lo que puede tener varias instancias dentro del asistente)

Más información here.

Cuestiones relacionadas