Android: Asistente como actividad con fragmentos

Helo.

He leído mucho aquí y en otros sitios, pero parece que nadie tiene una solución de trabajo para el uso de fragmentos como asistente como la aplicación.

Trato de implementar uno, pero tengo algunos problemas en este momento.

Aquí está el XML de la actividad con marcador de posición para Fragmentos de paso:

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads" android:layout_width="match_parent" android:layout_height="match_parent" > <FrameLayout android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@+id/cmd_previous" android:layout_alignParentTop="true" > </FrameLayout> <Button android:id="@+id/cmd_previous" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignRight="@+id/center_separator_buttons" android:text="@string/rpz_cmd_perv" /> <View android:id="@+id/center_separator_buttons" style="@style/wd_center_aligner" android:layout_alignParentBottom="true" /> <Button android:id="@+id/cmd_next" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/center_separator_buttons" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:text="@string/rpz_cmd_next" /> </RelativeLayout> 

En OnCreate agrego el primer paso a la actividad:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_report_wizard); if (this.getIntent().getExtras() != null) { Bundle extra = this.getIntent().getExtras(); if (extra.containsKey(ISelected.ID_KEY)) { _ID = extra.getLong(ISelected.ID_KEY); } } if (findViewById(R.id.fragment_container) != null && savedInstanceState == null) { _ReportTypeAndName = new ReportWizardTypeAndNameFragment(); _ReportTypeAndName.setArguments(getIntent().getExtras()); getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, _ReportTypeAndName).commit(); } } 

El botón NEXT reemplaza el Fragmento actual por uno nuevo. Esto parece funcionar bien.

 private void runNext(View view) { switch (_CurrentPage) { case ReportTypeAndName: _ReportSelect = new ReportWizardSelectFragment(); _ReportSelect.setArguments(getIntent().getExtras()); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, _ReportSelect).addToBackStack(null).commit(); _CurrentPage = ReportWizardPage.ReportSelect; break; case ReportSelect: _CurrentPage = ReportWizardPage.ReportPreview; break; case ReportPreview: _CurrentPage = ReportWizardPage.None; break; default: break; } } 

Pero en el botón PREVIOUS, esto no funciona.

 private void runPrevious(View view) { switch (_CurrentPage) { case ReportTypeAndName: // Umstellung des Typs _CurrentPage = ReportWizardPage.None; this.finish(); break; case ReportSelect: _ReportTypeAndName = new ReportWizardTypeAndNameFragment(); _ReportTypeAndName.setArguments(getIntent().getExtras()); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, _ReportTypeAndName).commit(); _CurrentPage = ReportWizardPage.ReportTypeAndName; break; case ReportPreview: _CurrentPage = ReportWizardPage.ReportSelect; break; default: break; } } 

Tengo el siguiente Error (LogCat):

 FATAL EXCEPTION: main android.view.InflateException: Binary XML file line #13: Error inflating class fragment at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697) at android.view.LayoutInflater.rInflate(LayoutInflater.java:739) at android.view.LayoutInflater.inflate(LayoutInflater.java:489) at android.view.LayoutInflater.inflate(LayoutInflater.java:396) at de.webducer.android.worktime.beta.ui.fragment.ReportWizardTypeAndNameFragment.onCreateView(ReportWizardTypeAndNameFragment.java:40) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:870) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416) at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:420) at android.os.Handler.handleCallback(Handler.java:605) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4424) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.IllegalArgumentException: Binary XML file line #13: Duplicate id 0x7f05008b, tag null, or parent id 0x0 with another fragment for de.webducer.android.worktime.beta.ui.fragment.ReportTypeSelectorSpinnerFragment at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:275) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:669) ... 18 more 

La línea 40 del Fragmento es el inflado de ellos

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.frag_report_wizard_1, container, false); } 

¿Cómo puedo enlazar (agregar / quitar) los fragmentos sin obtener ID duplicados? ¿O cómo puedo reutilizar el fragmento sin nueva Ver-Inicialización?

introduzca la descripción de la imagen aquí

Ponga sus fragmentos en el backstack y llámelos de regreso según sea necesario.

Añádelo al backstack usando addToBackStack :

 list = new ListFragment_List(); getFragmentManager().beginTransaction().replace(R.id.pane, listlist).addToBackStack(null).commit(); 

Tire de nuevo con popBackStack :

 FragmentManager fm = getActivity().getSupportFragmentManager(); fm.popBackStack(); 

Tenga en cuenta que este código proviene de una aplicación de mina que utiliza la biblioteca de soporte v4, por lo que la llamada para el administrador de fragmentos será ligeramente diferente si está desarrollando para Android 3.0 o superior solamente.

Yo uso la biblioteca de soporte v4 y Sherlock Actionbar.

Después de algunos intentos con y sin BackStack y simplificar el diseño de fragmentos de paso, finalmente encontré la razón de la excepción.

Yo uso un fragmento (spinner selction) en mi primer paso fragmen (ver XML-layout)

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/lbl_report_type" style="@style/wd_field_label" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:text="@string/rpz_lbl_report_type" /> <fragment android:id="@+id/frag_report_type_spinner" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/lbl_report_type" class="de.webducer.android.ReportTypeSelectorSpinnerFragment" /> <TextView android:id="@+id/lbl_report_name" style="@style/wd_field_label" android:layout_alignParentLeft="true" android:layout_below="@+id/frag_report_type_spinner" android:text="@string/rpz_lbl_report_name" /> <EditText android:id="@+id/report_name" style="@style/wd_text_edit_pref" android:layout_alignParentLeft="true" android:layout_below="@+id/lbl_report_name" android:hint="@string/rpz_hint_report_name" /> <TextView android:id="@+id/lbl_report_comment" style="@style/wd_field_label" android:layout_alignParentLeft="true" android:layout_below="@+id/report_name" android:text="@string/rpz_lbl_report_comment" /> <EditText android:id="@+id/report_comment" style="@style/wd_text_multi_edit_pref" android:layout_alignParentLeft="true" android:layout_below="@+id/lbl_report_comment" android:hint="@string/rpz_hint_report_comment" /> <TextView android:id="@+id/lbl_active" style="@style/wd_field_label" android:layout_alignParentLeft="true" android:layout_below="@+id/report_comment" android:text="@string/lbl_active" /> <CheckBox android:id="@+id/report_type_active" style="@style/wd_text_edit_pref" android:layout_alignParentLeft="true" android:layout_below="@+id/lbl_active" android:checked="true" android:text="@string/rpz_hint_report_type_active" /> </RelativeLayout> 

Este fragmento interno produjo la excepción porque el fragmento externo intenta en onCreateView para inflar el fragmento interno . Y éste ya está en FragmentManager con el ID dado.

Mi solución ahora es destruir el fragmento interno bevore reemplazar con uno nuevo o antes de la llamada de la pila trasera.

 private void runPrevious(View view) { switch (_CurrentPage) { case ReportTypeAndName: // Umstellung des Typs _CurrentPage = ReportWizardPage.None; this.finish(); break; case ReportSelect: if (getSupportFragmentManager().findFragmentById(R.id.frag_report_type_spinner) != null) { getSupportFragmentManager().beginTransaction() .remove(getSupportFragmentManager().findFragmentById(R.id.frag_report_type_spinner)).commit(); } getSupportFragmentManager().popBackStack(); // Umstellung des Typs _CurrentPage = ReportWizardPage.ReportTypeAndName; break; case ReportPreview: _CurrentPage = ReportWizardPage.ReportSelect; break; default: break; } setButtonState(); } 

Espero, esta ayuda othesr, que trata de implementar magos.

Pensé que usted podría querer saber que ahora hay una solución de trabajo para exactamente lo que estaba buscando. Es una librería Android ligera llamada WizarDroid .

  • FragmentPagerAdapter dentro de Fragment
  • El método add (int, Fragment, String) en el tipo FragmentTransaction no es aplicable para los argumentos (int, Fragment, String)
  • Pestaña Switch onNewIntent causa IllegalStateException
  • El fragmento de cuadro de diálogo personalizado se bloquea cuando se llama al método Setter
  • ViewPager en TabFragment no se carga por segunda vez
  • ViewPager dentro de Fragmento no muestra a pesar de usar getChildFragmentManager () al construir FragmentPagerAdapter
  • ¿Algún ejemplo simple usando roboguice con fragmentos en android?
  • Doble fragmento de rotación de Android con ActionBar
  • Cómo puedo declarar un fragmento como oculto en un diseño XML
  • Uso de fragmento anidado y objeto animador al lado
  • Fragmento - cómo puede getActivity () return null DESPUÉS onAttach
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.