Bu derste fragmentlerdeki backstack kavramının ne olduğundan, neden ihtiyaç duyduğumuzdan ve nasıl kullanacağımızdan bahsetmeye çalıştım.
Activiy’lerde butona tıkladığımızda yeni bir activiy açıldığını düşünelim. Sonra geri tuşuna tıklanıldığında açılan activity kapatılır ve ilk activity ekrana gelir. Bu istediğimiz bir durumdur. Ama fragmentlerde durum varsayılan olarak böyle değildir.
Bir acitivityde ekrana sırasıyla bir a fragmenti, sonra da b fragmenti eklediğimizi düşünelim. B fragmenti oluştuktan sonra geri butonuna tıklanıldığında beklenen davranış a fragmentinin eklendiği duruma geri gelmektir ama öyle olmaz. Geri butonu ana activity’i sonlandırır.
Bu durumları ele almak için fragmentlerdeki transactionları stack yani yığın kullanılır.
addToBackStack methodu ile transaction yığına eklenir. Bu methodu kullanırken tagları parametre olarak kullanabiliriz.
popBackStack methodu ile de geri gelme işlemi yapılabilir. Bu method parametresiz olarak kullanılırsa bir önceki transactiona gelinir. Parametreli versiyonunda iki adet parametre gönderiririz. Birinci parametre geri gelinmek istenen transaction’ın tag değeridir. İkinci parametre iki farklı değer alabilir.
İkinci parametre’yi 0 olarak gönderirsek tag bilgisi verilen transactiona kadar olan tüm transactionlar yığından çıkarılır. Eğer POP_BACK_STACK_INCLUSIVE flag’i verirsek tag bilgisi verilen transaction da yığından çıkarılır.
Backstack değişimleri için FragmentManager.OnBackStackChangedListener interfacesi kullanılır.
Bu örnek için yazılan kodlar aşağıdadır…
Umarım faydalı bir ders olmuştur…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 |
package com.example.emrealtunbilek.fragmentbackstack; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Toast; public class MainActivity extends AppCompatActivity implements FragmentManager.OnBackStackChangedListener { FragmentManager manager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); manager=getFragmentManager(); manager.addOnBackStackChangedListener(this); } public void addFragmentA(View v){ FragmentA fragmentA=new FragmentA(); FragmentTransaction transaction=manager.beginTransaction(); transaction.add(R.id.container, fragmentA, "fragA"); transaction.addToBackStack("addFragA"); transaction.commit(); } public void addFragmentB(View v){ FragmentB fragmentB=new FragmentB(); FragmentTransaction transaction=manager.beginTransaction(); transaction.add(R.id.container, fragmentB, "fragB"); transaction.addToBackStack("addFragB"); transaction.commit(); } public void removeFragmentA(View v){ FragmentA fragmentA= (FragmentA) manager.findFragmentByTag("fragA"); FragmentTransaction transaction=manager.beginTransaction(); if(fragmentA!=null) { transaction.remove(fragmentA); transaction.addToBackStack("removeFragA"); transaction.commit(); }else{ Toast.makeText(this,"Fragment A bulunamadı", Toast.LENGTH_LONG).show(); } } public void removeFragmentB(View v){ FragmentB fragmentB= (FragmentB) manager.findFragmentByTag("fragB"); FragmentTransaction transaction=manager.beginTransaction(); if(fragmentB!=null) { transaction.remove(fragmentB); transaction.addToBackStack("removeFragB"); transaction.commit(); }else{ Toast.makeText(this,"Fragment B bulunamadı", Toast.LENGTH_LONG).show(); } } public void replaceByFragmentA(View v){ FragmentA fragmentA=new FragmentA(); FragmentTransaction transaction=manager.beginTransaction(); transaction.replace(R.id.container, fragmentA, "fragA"); transaction.addToBackStack("replaceFragA"); transaction.commit(); } public void replaceByFragmentB(View v){ FragmentB fragmentB=new FragmentB(); FragmentTransaction transaction=manager.beginTransaction(); transaction.replace(R.id.container, fragmentB, "fragB"); transaction.addToBackStack("replaceFragB"); transaction.commit(); } public void attachFragmentA(View v){ FragmentA fragmentA= (FragmentA) manager.findFragmentByTag("fragA"); FragmentTransaction transaction=manager.beginTransaction(); if(fragmentA!=null) { transaction.attach(fragmentA); transaction.addToBackStack("attachFragA"); transaction.commit(); } else{ Toast.makeText(this,"Fragment A bulunamadı", Toast.LENGTH_LONG).show(); } } public void detachFragmentA(View v){ FragmentA fragmentA= (FragmentA) manager.findFragmentByTag("fragA"); FragmentTransaction transaction=manager.beginTransaction(); if(fragmentA!=null) { transaction.detach(fragmentA); transaction.addToBackStack("detachFragA"); transaction.commit(); } else{ Toast.makeText(this,"Fragment A bulunamadı", Toast.LENGTH_LONG).show(); } } public void showFragmentA(View v){ FragmentA fragmentA=(FragmentA) manager.findFragmentByTag("fragA"); FragmentTransaction transaction=manager.beginTransaction(); if(fragmentA!=null){ transaction.show(fragmentA); transaction.addToBackStack("showFragA"); transaction.commit(); }else{ Toast.makeText(this,"Fragment A bulunamadı", Toast.LENGTH_LONG).show(); } } public void hideFragmentA(View v){ FragmentA fragmentA=(FragmentA) manager.findFragmentByTag("fragA"); FragmentTransaction transaction=manager.beginTransaction(); if(fragmentA!=null){ transaction.hide(fragmentA); transaction.addToBackStack("hideFragA"); transaction.commit(); }else{ Toast.makeText(this,"Fragment A bulunamadı", Toast.LENGTH_LONG).show(); } } public void backButton(View v){ manager.popBackStack(); } public void popAddAInclusive(View v){ manager.popBackStack("addFragA", FragmentManager.POP_BACK_STACK_INCLUSIVE); } public void popAddB(View v){ manager.popBackStack("addFragB", 0); } @Override public void onBackStackChanged() { int elemanSayisi=manager.getBackStackEntryCount(); StringBuilder mesaj=new StringBuilder(""); for(int i=elemanSayisi-1; i>=0; i--) { mesaj.append("Index ").append(i).append(" : "); mesaj.append(manager.getBackStackEntryAt(i).getName()); mesaj.append(" \n"); } Log.e("EMRE", mesaj.toString()+" \n"); } } |