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.
- No se encontró ninguna vista para id - DialogFragment + Fragment
- Selección de la imagen de la galería con fragmento
- OnCreateView no se llama con Fragment en ViewPager
- Transmisión de datos de un fragmento de actividad a otro fragmento de actividad
- ActionBar Tabs con fragmentos en rotació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?
- El cierre de sesión de otra actividad en Google más la integración no es un trabajo
- ViewPager + FragmentPagerAdapter dentro de un DialogFragment obtiene "IllegalArgumentException: No se encontró ninguna vista ..."
- ¿Cómo iniciar el Fragmento de la Actividad?
- Android: Acceder al objeto de actividad del contenedor desde el fragmento usando putExtra?
- Fragmento de Android se está destruyendo pero recibiendo onActivityResult
- Android Fragment creó dos veces el cambio de orientación
- Desvinculación de un fragmento que no activa onSaveInstanceState ()
- Menú de opciones de la barra de acciones de FragmentActivity
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 .
- Alinear elementos del menú de opciones (en ActionBar)
- Android GCM: no obtener el token de registro en el método onCreate ()