Android Fragment, volver sin recargar / recargar Fragmento

He visto bastantes preguntas sobre SO sobre Fragmentos y todavía no puedo imaginar si lo que quiero hacer es posible, y más aún si mi patrón de diseño es sólo defectuoso y tengo que volver a trabajar todo el proceso. Básicamente, como la mayoría de las preguntas que se han hecho, tengo una ActionBar con NavigationTabs (usando ActionBarSherlock), luego dentro de cada ficha hay una FragementActivity y luego FragmentActivities empujar nuevos Fragmentos cuando se selecciona una fila (Estoy tratando de volver a crear Un proyecto de iOS en Android y es sólo una aplicación basada en la navegación básica con algunas pestañas que pueden profundizar en información específica). Cuando hago clic en el botón Atrás del teléfono, el Fragmento anterior se carga pero el Fragmento se vuelve a crear (por lo que los WebServices se llaman de nuevo para cada vista) y esto no es necesario ya que la información no cambiará en una vista anterior cuando Ir hacia atrás. Así que básicamente lo que quiero averiguar es cómo puedo configurar mis fragmentos para que cuando presiono el botón de retroceso en el teléfono, el fragmento anterior es simplemente levantado con los elementos anteriores ya creado. A continuación se muestra mi código actual:

//This is from my FragmentActivity Class that contains the ActionBar and Tab Selection Control @Override public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { // TODO Auto-generated method stub int selectedTab = tab.getPosition(); if (selectedTab == 0) { SalesMainScreen salesScreen = new SalesMainScreen(); ft.replace(R.id.content, salesScreen); } else if (selectedTab == 1) { ClientMainScreen clientScreen = new ClientMainScreen(); ft.replace(R.id.content, clientScreen); }..... //This is within the ClientMainScreen Fragment Class, which handles moving to the Detail Fragment row.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //Do something if Row is clicked try{ String selectedClientName = clientObject.getString("ClientName"); String selectedClientID = clientObject.getString("ClientID"); String selectedValue = clientObject.getString("ClientValue"); transaction = getFragmentManager().beginTransaction(); ClientDetailScreen detailScreen = new ClientDetailScreen(); detailScreen.clientID = selectedClientID; detailScreen.clientName = selectedClientName; detailScreen.clientValue = selectedValue; int currentID = ((ViewGroup)getView().getParent()).getId(); transaction.replace(currentID,detailScreen); transaction.addToBackStack(null); transaction.commit(); } catch (Exception e) { e.printStackTrace(); } } });.... //And then this is the Client Detail Fragment, with the method being called to Call the Web Service and create thew (since what is displayed on this screen is dependent on what is found in the Web Service @Override public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved) { return inflater.inflate(R.layout.clientdetailscreen, group, false); } @Override public void onActivityCreated (Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //Setup Preferences File Link this.preferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); //initialize the table object mainTable = (TableLayout)getActivity().findViewById(R.id.mainTable); //setup the detail table setupRelatedClientSection(); } 

La pantalla de detalle del cliente puede explorar una vez más, utilizando el mismo método que la pantalla principal del cliente, pero cuando vuelvo de esa nueva pantalla a la pantalla de detalle, el método de seuptRelatedClientSection () se vuelve a llamar y así se reconstruye todo el fragmento cuando Realmente sólo quiero sacar una versión guardada de esa pantalla. ¿Es esto posible con mi configuración actual, o lo he abordado de la manera equivocada?

Creo que usted está buscando para show() y hide() .

Creo que todavía puedes agregarlos al backstack.

  transaction.hide(currentFragment); transaction.show(detailScreen); transaction.addToBackStack(null); transaction.commit(); 

No tenía mi código para mirar, pero creo que esto es lo que iba a … Pruebe a menos que alguien tiene una mejor manera. No he probado el backstack con show () hide (), pero creo que se llevan a cabo los cambios que se realizan antes de que las transacciones se comprometan y se deshacerán si se pulsa el botón de retroceso. Por favor, vuelva a mí en esta causa estoy interesado en saber.

También tiene que asegurarse de que el fragmento de detalle se crea antes de llamar a esto. Dado que se basa en el clic de someitem, probablemente debería crear el fragmento de detalles cada vez que haga clic para asegurarse de que se crea el fragmento de detalles correcto.

Intente usar fragementTransaction.add en lugar de reemplazar

Estoy publicando esta respuesta para las personas que pueden referir esta pregunta en el futuro.

El siguiente código mostrará cómo abrir FragmentB de FragmentA y volver a FragmentA de FragmentB (sin actualizar FragmentA) presionando el botón Atrás.

 public class FragmentA extends Fragment{ ... void openFragmentB(){ FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); FragmentB fragmentB = FragmentB.newInstance(); if (fragmentB.isAdded()) { return; } else { fragmentManager. beginTransaction(). add(R.id.mainContainer,fragmentB). addToBackStack(FragmentB.TAG). commit(); } } } public class FragmentB extends Fragment{ public static final String TAG = FragmentB.class.getSimpleName(); ... public static FragmentB newInstance(){ FragmentB fragmentB = new FragmentB(); return fragmentB; } @Override public void onResume() { super.onResume(); // add this piece of code in onResume method this.getView().setFocusableInTouchMode(true); this.getView().requestFocus(); } } 

En la anulación de MainActivity onBackPressed ()

 class MainActivity extends Activity{ ... @Override public void onBackPressed() { if (getFragmentManager().getBackStackEntryCount() > 0) { getFragmentManager().popBackStack(); } else { super.onBackPressed(); } } } 

Usted tiene razón, ha habido una serie de preguntas / documentación anterior sobre el tema;)

La documentación sobre fragmentos, específicamente la sección sobre transacciones y estado de ahorro, le guiará a la respuesta.

http://developer.android.com/guide/components/fragments.html#Transactions

http://developer.android.com/guide/components/activities.html#SavingActivityState

Android – Fragment onActivityResult evitar la recarga

Los fragmentos pueden tener soporte para onSaveInstanceState pero no onRestoreInstanceState , por lo que si desea guardar una referencia a las vistas de tabla, onActivityCreated en el Bundle y puede acceder a la vista guardada en su método onActivityCreated . También puede utilizar la pila trasera Fragmentos.

Esta guía / tutorial tiene instrucciones / ejemplos muy detallados en la pila trasera y el estado del fragmento de retención.

Buena suerte

  • El fragmento no se puede convertir en Contexto
  • Problema de devolución de llamada de diálogo a pantalla completa de Android
  • Cómo reemplazar View Pager ver completamente con un nuevo Fragmento en Android
  • Cómo cargar la misma preferencia de pantalla en el detalle PreferenceFragment
  • Android Fragment onCreateView vs. onActivityCreated
  • Cambiando dinámicamente los fragmentos dentro de un host de fichas de fragmentos?
  • OnAttach (Activity) obsoleto: donde puedo comprobar si la actividad implementa la interfaz de devolución de llamada
  • Quitar y agregar la página a FragmentPagerAdapter
  • VideoView no se muestra en un fragmento
  • RecyclerView con fragmentos
  • Ver Pager Crash Null Pointer Excepción debido a navegar de nuevo al fragmento antiguo - Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.