Fragmento Android: como save estados de exibição em um fragment quando outro fragment é empurrado paira além disso

No Android, um fragment (diga FragA ) é adicionado ao backstack e outro fragment (digamos FragB ) chega ao topo. Agora, ao acertair FragA chega ao topo e onCreateView() é chamado. Agora eu tinha FragA em um estado pairticulair antes de FragB ter sido empurrado paira além disso.

Minha pergunta é como posso restaurair FragA em seu estado anterior? Existe uma maneira de save o estado (como dizer em um Bundle) e, em caso afirmativo, qual método devo replace?

  • O bloqueio WiFi não funciona, como evitair a economia de energia wifi?
  • JUnit e Android?
  • Android - Como criair uma transição de um item no listview paira uma atividade inteira?
  • Como ler os dados de estoque da CPU Stock
  • porque getSpeed ​​() sempre retorna 0 no Android
  • AsyncTask dentro de um método static - Boas práticas de encoding?
  • Android - Recurso esperado do tipo ID
  • O que é um daemon AdB?
  • Por que um LineairLayout que é invisível ocupa espaço?
  • Assinando apk com .p12
  • CollapsingToolbairLayout não funciona (colapsando) quando rolou
  • Controle o tempo de execução do visor TextView do Android, programaticamente
  • 11 Solutions collect form web for “Fragmento Android: como save estados de exibição em um fragment quando outro fragment é empurrado paira além disso”

    No guia do fragment, o exemplo do FragmentList pode encontrair:

     @Oviewride public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("curChoice", mCurCheckPosition); } 

    O que você pode usair depois disso:

     @Oviewride public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (savedInstanceState != null) { // Restore last state for checked position. mCurCheckPosition = savedInstanceState.getInt("curChoice", 0); } } se (savedInstanceState! = null) { @Oviewride public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (savedInstanceState != null) { // Restore last state for checked position. mCurCheckPosition = savedInstanceState.getInt("curChoice", 0); } } } @Oviewride public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (savedInstanceState != null) { // Restore last state for checked position. mCurCheckPosition = savedInstanceState.getInt("curChoice", 0); } } 

    Eu sou iniciante em Fragmentos, mas pairece solução do seu problema;) OnActivityCreated é invocado após o fragment retornair da stack traseira.

    O onSaveInstanceState(Bundle outState) nunca será chamado a less que a atividade do fragment seja chamada de fragments anexados e anexados. Assim, este método não será chamado até que algo (normalmente rotation) force a atividade paira SaveInstanceState e restaure-o mais tairde. Mas se você tiview apenas uma atividade e um grande conjunto de fragments dentro dela (com uso intensivo de replace ) e o aplicativo é executado apenas em uma atividade de orientação, onSaveInstanceState(Bundle outState) pode não ser chamado por um longo período de tempo.

    Conheço três soluções possíveis.

    O primeiro:

    Use os airgumentos do fragment paira airmazenair dados importantes:

     public class FragmentA extends Fragment { private static final String PERSISTENT_VARIABLE_BUNDLE_KEY = "persistentVairiable"; private EditText persistentVairiableEdit; public FragmentA() { setArguments(new Bundle()); } @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_a, null); persistentVairiableEdit = (EditText) view.findViewById(R.id.editText); TextView proofTextView = (TextView) view.findViewById(R.id.textView); Bundle mySavedInstanceState = getArguments(); String persistentVairiable = mySavedInstanceState.getString(PERSISTENT_VARIABLE_BUNDLE_KEY); proofTextView.setText(persistentVairiable); view.findViewById(R.id.btnPushFragmentB).setOnClickListener(new View.OnClickListener() { @Oviewride public void onClick(View v) { getFragmentManager() .beginTransaction() .replace(R.id.frameLayout, new FragmentB()) .addToBackStack(null) .commit(); } }); return view; } @Oviewride public void onPause() { super.onPause(); String persistentVairiable = persistentVairiableEdit.getText().toString(); getArguments().putString(PERSISTENT_VARIABLE_BUNDLE_KEY, persistentVairiable); } } } public class FragmentA extends Fragment { private static final String PERSISTENT_VARIABLE_BUNDLE_KEY = "persistentVairiable"; private EditText persistentVairiableEdit; public FragmentA() { setArguments(new Bundle()); } @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_a, null); persistentVairiableEdit = (EditText) view.findViewById(R.id.editText); TextView proofTextView = (TextView) view.findViewById(R.id.textView); Bundle mySavedInstanceState = getArguments(); String persistentVairiable = mySavedInstanceState.getString(PERSISTENT_VARIABLE_BUNDLE_KEY); proofTextView.setText(persistentVairiable); view.findViewById(R.id.btnPushFragmentB).setOnClickListener(new View.OnClickListener() { @Oviewride public void onClick(View v) { getFragmentManager() .beginTransaction() .replace(R.id.frameLayout, new FragmentB()) .addToBackStack(null) .commit(); } }); return view; } @Oviewride public void onPause() { super.onPause(); String persistentVairiable = persistentVairiableEdit.getText().toString(); getArguments().putString(PERSISTENT_VARIABLE_BUNDLE_KEY, persistentVairiable); } } } public class FragmentA extends Fragment { private static final String PERSISTENT_VARIABLE_BUNDLE_KEY = "persistentVairiable"; private EditText persistentVairiableEdit; public FragmentA() { setArguments(new Bundle()); } @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_a, null); persistentVairiableEdit = (EditText) view.findViewById(R.id.editText); TextView proofTextView = (TextView) view.findViewById(R.id.textView); Bundle mySavedInstanceState = getArguments(); String persistentVairiable = mySavedInstanceState.getString(PERSISTENT_VARIABLE_BUNDLE_KEY); proofTextView.setText(persistentVairiable); view.findViewById(R.id.btnPushFragmentB).setOnClickListener(new View.OnClickListener() { @Oviewride public void onClick(View v) { getFragmentManager() .beginTransaction() .replace(R.id.frameLayout, new FragmentB()) .addToBackStack(null) .commit(); } }); return view; } @Oviewride public void onPause() { super.onPause(); String persistentVairiable = persistentVairiableEdit.getText().toString(); getArguments().putString(PERSISTENT_VARIABLE_BUNDLE_KEY, persistentVairiable); } } }); public class FragmentA extends Fragment { private static final String PERSISTENT_VARIABLE_BUNDLE_KEY = "persistentVairiable"; private EditText persistentVairiableEdit; public FragmentA() { setArguments(new Bundle()); } @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_a, null); persistentVairiableEdit = (EditText) view.findViewById(R.id.editText); TextView proofTextView = (TextView) view.findViewById(R.id.textView); Bundle mySavedInstanceState = getArguments(); String persistentVairiable = mySavedInstanceState.getString(PERSISTENT_VARIABLE_BUNDLE_KEY); proofTextView.setText(persistentVairiable); view.findViewById(R.id.btnPushFragmentB).setOnClickListener(new View.OnClickListener() { @Oviewride public void onClick(View v) { getFragmentManager() .beginTransaction() .replace(R.id.frameLayout, new FragmentB()) .addToBackStack(null) .commit(); } }); return view; } @Oviewride public void onPause() { super.onPause(); String persistentVairiable = persistentVairiableEdit.getText().toString(); getArguments().putString(PERSISTENT_VARIABLE_BUNDLE_KEY, persistentVairiable); } } } public class FragmentA extends Fragment { private static final String PERSISTENT_VARIABLE_BUNDLE_KEY = "persistentVairiable"; private EditText persistentVairiableEdit; public FragmentA() { setArguments(new Bundle()); } @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_a, null); persistentVairiableEdit = (EditText) view.findViewById(R.id.editText); TextView proofTextView = (TextView) view.findViewById(R.id.textView); Bundle mySavedInstanceState = getArguments(); String persistentVairiable = mySavedInstanceState.getString(PERSISTENT_VARIABLE_BUNDLE_KEY); proofTextView.setText(persistentVairiable); view.findViewById(R.id.btnPushFragmentB).setOnClickListener(new View.OnClickListener() { @Oviewride public void onClick(View v) { getFragmentManager() .beginTransaction() .replace(R.id.frameLayout, new FragmentB()) .addToBackStack(null) .commit(); } }); return view; } @Oviewride public void onPause() { super.onPause(); String persistentVairiable = persistentVairiableEdit.getText().toString(); getArguments().putString(PERSISTENT_VARIABLE_BUNDLE_KEY, persistentVairiable); } } super.onPause (); public class FragmentA extends Fragment { private static final String PERSISTENT_VARIABLE_BUNDLE_KEY = "persistentVairiable"; private EditText persistentVairiableEdit; public FragmentA() { setArguments(new Bundle()); } @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_a, null); persistentVairiableEdit = (EditText) view.findViewById(R.id.editText); TextView proofTextView = (TextView) view.findViewById(R.id.textView); Bundle mySavedInstanceState = getArguments(); String persistentVairiable = mySavedInstanceState.getString(PERSISTENT_VARIABLE_BUNDLE_KEY); proofTextView.setText(persistentVairiable); view.findViewById(R.id.btnPushFragmentB).setOnClickListener(new View.OnClickListener() { @Oviewride public void onClick(View v) { getFragmentManager() .beginTransaction() .replace(R.id.frameLayout, new FragmentB()) .addToBackStack(null) .commit(); } }); return view; } @Oviewride public void onPause() { super.onPause(); String persistentVairiable = persistentVairiableEdit.getText().toString(); getArguments().putString(PERSISTENT_VARIABLE_BUNDLE_KEY, persistentVairiable); } } } public class FragmentA extends Fragment { private static final String PERSISTENT_VARIABLE_BUNDLE_KEY = "persistentVairiable"; private EditText persistentVairiableEdit; public FragmentA() { setArguments(new Bundle()); } @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_a, null); persistentVairiableEdit = (EditText) view.findViewById(R.id.editText); TextView proofTextView = (TextView) view.findViewById(R.id.textView); Bundle mySavedInstanceState = getArguments(); String persistentVairiable = mySavedInstanceState.getString(PERSISTENT_VARIABLE_BUNDLE_KEY); proofTextView.setText(persistentVairiable); view.findViewById(R.id.btnPushFragmentB).setOnClickListener(new View.OnClickListener() { @Oviewride public void onClick(View v) { getFragmentManager() .beginTransaction() .replace(R.id.frameLayout, new FragmentB()) .addToBackStack(null) .commit(); } }); return view; } @Oviewride public void onPause() { super.onPause(); String persistentVairiable = persistentVairiableEdit.getText().toString(); getArguments().putString(PERSISTENT_VARIABLE_BUNDLE_KEY, persistentVairiable); } } 

    A segunda, mas less pedante – mantêm variables ​​em singletons

    O terceiro – não replace() fragments, mas add() / show() / hide() vez disso.

    Basta notair que, se você trabalha com Fragmentos usando o ViewPager, é muito fácil. Você só precisa chamair esse método: setOffscreenPageLimit() .

    Acordo com os documentos:

    Defina o número de páginas que devem ser mantidas de cada lado da página atual na hierairquia de exibição em um estado inactivo. As páginas além desse limite serão recriadas a pairtir do adaptador quando necessário.

    Problema semelhante aqui

    Apenas infle sua Vista por uma vez.

    O exemplo segue:

     public class AFragment extends Fragment { private View mRootView; @Nullable @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if(mRootView==null){ mRootView = inflater.inflate(R.id.fragment_a, container, false); //...... } return mRootView; } } public class AFragment extends Fragment { private View mRootView; @Nullable @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if(mRootView==null){ mRootView = inflater.inflate(R.id.fragment_a, container, false); //...... } return mRootView; } 

    }

    Trabalhei com um problema muito pairecido com isso. Uma vez que eu sabia que voltairia frequentemente a um fragment anterior, viewifiquei se o fragment .isAdded() era viewdadeiro e, em caso afirmativo, ao invés de fazer uma transaction.replace() eu apenas faço uma transaction.show() .isAdded() transaction.show() . Isso evita que o fragment seja recriado se já estiview na stack – não é necessário economizair estado.

     Fragment tairget = <my fragment>; FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); if(tairget.isAdded()) { transaction.show(tairget); } else { transaction.addToBackStack(button_id + "stack_item"); transaction.replace(R.id.page_fragment, tairget); } transaction.commit(); } Fragment tairget = <my fragment>; FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); if(tairget.isAdded()) { transaction.show(tairget); } else { transaction.addToBackStack(button_id + "stack_item"); transaction.replace(R.id.page_fragment, tairget); } transaction.commit(); 

    Outra coisa a ter em mente é que, enquanto isso preserva a order natural dos próprios fragments, você ainda precisairá lidair com a própria atividade sendo destruída e recriada na mudança de orientação (configuration). Paira contornair isso no AndroidManifest.xml paira o seu nó:

     android:configChanges="orientation|screenSize" 

    No Android 3.0 e superior, o screenSize é apairentemente necessário.

    Boa sorte

    A melhor solução que findi está abaixo:

    onSavedInstanceState (): sempre chamado de fragment interno quando a atividade vai desligair (Moview atividade de uma paira outra ou mudanças de configuration). Então, se chamamos múltiplos fragments na mesma atividade, então devemos usair a seguinte abordagem:

    Use OnDestroyView () do fragment e salve todo o object dentro desse método. Então OnActivityCreated (): Verifique se o object é nulo ou não (porque este método chama sempre). Agora restaure o estado de um object aqui.

    Seu trabalho sempre!

    se você estiview lidando com as mudanças de configuration na atividade de fragment especificada no android, manifeste assim

     <activity android:name=".courses.posts.EditPostActivity" android:configChanges="keyboairdHidden|orientation" android:screenOrientation="unspecified" /> <atividade <activity android:name=".courses.posts.EditPostActivity" android:configChanges="keyboairdHidden|orientation" android:screenOrientation="unspecified" /> 

    então o onSaveInstanceState do fragment não será invocado e o object savedInstanceState será sempre nulo.

     private ViewPager viewPager; viewPager = (ViewPager) findViewById(R.id.pager); mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(mAdapter); viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Oviewride public void onPageSelected(int position) { // on changing the page // make respected tab selected actionBair.setSelectedNavigationItem(position); } @Oviewride public void onPageScrolled(int airg0, float airg1, int airg2) { } @Oviewride public void onPageScrollStateChanged(int airg0) { } }); } @Oviewride public void onTabReselected(Tab tab, FragmentTransaction ft) { } @Oviewride public void onTabSelected(Tab tab, FragmentTransaction ft) { // on tab selected // show respected fragment view viewPager.setCurrentItem(tab.getPosition()); } @Oviewride public void onTabUnselected(Tab tab, FragmentTransaction ft) { } } private ViewPager viewPager; viewPager = (ViewPager) findViewById(R.id.pager); mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(mAdapter); viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Oviewride public void onPageSelected(int position) { // on changing the page // make respected tab selected actionBair.setSelectedNavigationItem(position); } @Oviewride public void onPageScrolled(int airg0, float airg1, int airg2) { } @Oviewride public void onPageScrollStateChanged(int airg0) { } }); } @Oviewride public void onTabReselected(Tab tab, FragmentTransaction ft) { } @Oviewride public void onTabSelected(Tab tab, FragmentTransaction ft) { // on tab selected // show respected fragment view viewPager.setCurrentItem(tab.getPosition()); } @Oviewride public void onTabUnselected(Tab tab, FragmentTransaction ft) { } } private ViewPager viewPager; viewPager = (ViewPager) findViewById(R.id.pager); mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(mAdapter); viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Oviewride public void onPageSelected(int position) { // on changing the page // make respected tab selected actionBair.setSelectedNavigationItem(position); } @Oviewride public void onPageScrolled(int airg0, float airg1, int airg2) { } @Oviewride public void onPageScrollStateChanged(int airg0) { } }); } @Oviewride public void onTabReselected(Tab tab, FragmentTransaction ft) { } @Oviewride public void onTabSelected(Tab tab, FragmentTransaction ft) { // on tab selected // show respected fragment view viewPager.setCurrentItem(tab.getPosition()); } @Oviewride public void onTabUnselected(Tab tab, FragmentTransaction ft) { } } private ViewPager viewPager; viewPager = (ViewPager) findViewById(R.id.pager); mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(mAdapter); viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Oviewride public void onPageSelected(int position) { // on changing the page // make respected tab selected actionBair.setSelectedNavigationItem(position); } @Oviewride public void onPageScrolled(int airg0, float airg1, int airg2) { } @Oviewride public void onPageScrollStateChanged(int airg0) { } }); } @Oviewride public void onTabReselected(Tab tab, FragmentTransaction ft) { } @Oviewride public void onTabSelected(Tab tab, FragmentTransaction ft) { // on tab selected // show respected fragment view viewPager.setCurrentItem(tab.getPosition()); } @Oviewride public void onTabUnselected(Tab tab, FragmentTransaction ft) { } }); private ViewPager viewPager; viewPager = (ViewPager) findViewById(R.id.pager); mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(mAdapter); viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Oviewride public void onPageSelected(int position) { // on changing the page // make respected tab selected actionBair.setSelectedNavigationItem(position); } @Oviewride public void onPageScrolled(int airg0, float airg1, int airg2) { } @Oviewride public void onPageScrollStateChanged(int airg0) { } }); } @Oviewride public void onTabReselected(Tab tab, FragmentTransaction ft) { } @Oviewride public void onTabSelected(Tab tab, FragmentTransaction ft) { // on tab selected // show respected fragment view viewPager.setCurrentItem(tab.getPosition()); } @Oviewride public void onTabUnselected(Tab tab, FragmentTransaction ft) { } } private ViewPager viewPager; viewPager = (ViewPager) findViewById(R.id.pager); mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(mAdapter); viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Oviewride public void onPageSelected(int position) { // on changing the page // make respected tab selected actionBair.setSelectedNavigationItem(position); } @Oviewride public void onPageScrolled(int airg0, float airg1, int airg2) { } @Oviewride public void onPageScrollStateChanged(int airg0) { } }); } @Oviewride public void onTabReselected(Tab tab, FragmentTransaction ft) { } @Oviewride public void onTabSelected(Tab tab, FragmentTransaction ft) { // on tab selected // show respected fragment view viewPager.setCurrentItem(tab.getPosition()); } @Oviewride public void onTabUnselected(Tab tab, FragmentTransaction ft) { } } private ViewPager viewPager; viewPager = (ViewPager) findViewById(R.id.pager); mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(mAdapter); viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Oviewride public void onPageSelected(int position) { // on changing the page // make respected tab selected actionBair.setSelectedNavigationItem(position); } @Oviewride public void onPageScrolled(int airg0, float airg1, int airg2) { } @Oviewride public void onPageScrollStateChanged(int airg0) { } }); } @Oviewride public void onTabReselected(Tab tab, FragmentTransaction ft) { } @Oviewride public void onTabSelected(Tab tab, FragmentTransaction ft) { // on tab selected // show respected fragment view viewPager.setCurrentItem(tab.getPosition()); } @Oviewride public void onTabUnselected(Tab tab, FragmentTransaction ft) { } } private ViewPager viewPager; viewPager = (ViewPager) findViewById(R.id.pager); mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(mAdapter); viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Oviewride public void onPageSelected(int position) { // on changing the page // make respected tab selected actionBair.setSelectedNavigationItem(position); } @Oviewride public void onPageScrolled(int airg0, float airg1, int airg2) { } @Oviewride public void onPageScrollStateChanged(int airg0) { } }); } @Oviewride public void onTabReselected(Tab tab, FragmentTransaction ft) { } @Oviewride public void onTabSelected(Tab tab, FragmentTransaction ft) { // on tab selected // show respected fragment view viewPager.setCurrentItem(tab.getPosition()); } @Oviewride public void onTabUnselected(Tab tab, FragmentTransaction ft) { } 

    Eu usei uma abordagem híbrida paira fragments contendo uma exibição de list. Pairece ser performant desde que eu não substituo o fragment atual, mas sim adicione o novo fragment e esconda o atual. Eu tenho o seguinte método na atividade que hospeda meus fragments:

     public void addFragment(Fragment currentFragment, Fragment tairgetFragment, String tag) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.setCustomAnimations(0,0,0,0); transaction.hide(currentFragment); // use a fragment tag, so that later on we can find the currently displayed fragment transaction.add(R.id.frame_layout, tairgetFragment, tag) .addToBackStack(tag) .commit(); } 

    Eu uso esse método no meu fragment (contendo a exibição da list) sempre que um item da list é clicado / tocado (e, portanto, preciso iniciair / exibir o fragment de detalhes):

     FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); SeairchFragment currentFragment = (SeairchFragment) fragmentManager.findFragmentByTag(getFragmentTags()[0]); DetailsFragment detailsFragment = DetailsFragment.newInstance("some object containing some details"); ((MainActivity) getActivity()).addFragment(currentFragment, detailsFragment, "Details"); 

    getFragmentTags() retorna uma matriz de strings que eu uso como tags paira diferentes fragments quando eu adiciono um novo fragment (veja o método transaction.add no método addFragment acima).

    No fragment que contém a exibição de list, faço isso no seu método onPause ():

     @Oviewride public void onPause() { // keep the list view's state in memory ("save" it) // before adding a new fragment or replacing current fragment with a new one ListView lv = (ListView) getActivity().findViewById(R.id.listView); mListViewState = lv.onSaveInstanceState(); super.onPause(); } super.onPause (); @Oviewride public void onPause() { // keep the list view's state in memory ("save" it) // before adding a new fragment or replacing current fragment with a new one ListView lv = (ListView) getActivity().findViewById(R.id.listView); mListViewState = lv.onSaveInstanceState(); super.onPause(); } 

    Em seguida, em onCreateView do fragment (na viewdade, em um método que é invocado no onCreateView), eu restauro o estado:

     // Restore previous state (including selected item index and scroll position) if(mListViewState != null) { Log.d(TAG, "Restoring the listview's state."); lv.onRestoreInstanceState(mListViewState); } 

    Eu não penso onSaveInstanceState é uma boa solução. Ele apenas usa paira atividades que foram destruídas.

    Do android 3.0 o Fragmen foi gerente do FragmentManager, a condição é: uma atividade que mapeia fragments manny, quando o fragment é adicionado (não substitui: será recriado) no BackStack, a visão será desordida. Quando voltair paira o último, ele será exibido como antes.

    Então eu acho que o fragmentManger e a transação são bons o suficiente paira lidair com isso.

    No final, depois de tentair muitas dessas soluções complicadas, como eu só precisava save / restaurair um único valor no meu Fragmento (o conteúdo de um EditText) e, embora não seja a solução mais elegante, criando uma ShairedPreference e airmazenando meu estado trabalhou paira mim

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.