İki parça arasında geçiş yapan sahte bir etkinlik yazdım. FragmentA'dan FragmentB'ye gittiğinizde, FragmentA arka yığına eklenir. Ancak, (geri basarak) FragmentA döndüğümde, tamamen yeni bir FragmentA oluşturulur ve içinde bulunduğu durum kaybolur. Bu soru ile aynı şey peşinde olduğumu hissediyorum olsun , ama sorunu kökten yardımcı olmak için tam bir kod örneği dahil ettik:
public class FooActivity extends Activity {
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(android.R.id.content, new FragmentA());
transaction.commit();
}
public void nextFragment() {
final FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(android.R.id.content, new FragmentB());
transaction.addToBackStack(null);
transaction.commit();
}
public static class FragmentA extends Fragment {
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View main = inflater.inflate(R.layout.main, container, false);
main.findViewById(R.id.next_fragment_button).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
((FooActivity) getActivity()).nextFragment();
}
});
return main;
}
@Override public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// Save some state!
}
}
public static class FragmentB extends Fragment {
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.b, container, false);
}
}
}
Bazı günlük mesajları eklendiğinde:
07-05 14:28:59.722 D/OMG ( 1260): FooActivity.onCreate
07-05 14:28:59.742 D/OMG ( 1260): FragmentA.onCreateView
07-05 14:28:59.742 D/OMG ( 1260): FooActivity.onResume
<Tap Button on FragmentA>
07-05 14:29:12.842 D/OMG ( 1260): FooActivity.nextFragment
07-05 14:29:12.852 D/OMG ( 1260): FragmentB.onCreateView
<Tap 'Back'>
07-05 14:29:16.792 D/OMG ( 1260): FragmentA.onCreateView
Asla FragmentA.onSaveInstanceState öğesini çağırmaz ve geri döndüğünüzde yeni bir FragmentA oluşturur. Ancak, eğer FragmentA üzerindeysem ve ekranı kilitlersem, FragmentA.onSaveInstanceState çağrılır. Çok garip ... Arka yığını eklenen bir parçanın yeniden yaratılmasını beklemiyor muyum? İşte ne dokümanlar ki:
Oysa, bir parçayı kaldırırken addToBackStack () öğesini çağırırsanız, parça durdurulur ve kullanıcı geri giderse devam ettirilir.
ListView
. Bir kaydırma dinleyicisi eklemek ve bir örnek değişkenini güncellemek için çok fazla çember atlama gibi görünüyor.