我最近開始使用碎片已經創建了一個演示應用程序看起來像這樣:如何保存和重用相同的碎片實例?
點擊片段1之間的每一個按鍵開關,片段2和片段3
我是什麼試圖完成每個片段只有1個實例並重用。 (請注意,所有片段都是動態創建和添加的)。目前我通過創建片段的HashMap並放置每個實例並從中抓取它來完成此操作。
所以我的問題是: 有沒有更好的方式來做到這一點: 通過使用FragmentManager的putFragment(...)方法? putFragment (Bundle bundle, String key, Fragment fragment)
我無法弄清楚如何在我的情況下使用它。如果有人能給我一個如何使用這種方法的例子。
是它昂貴守住我的活動的每個片段的參考?這是否保留所有的片段活着?我正在使用軟參考來解決這個問題,但我不確定這是否是正確的方法。請指出我採取任何其他方式來做到這一點,或讓我知道這是否是最好的方式來完成這一點。
在此先感謝。
這裏是我的代碼:
UPDATE: 我試圖從後面堆重用片段,試圖只有在後面堆棧不存在,它添加。下面的代碼給我的非法狀態異常後,我從片段導航離去的一個 - >回來給它 - >然後嘗試按後退按鈕:
10-28 13:21:40.255: ERROR/MessageQueue-JNI(3548): java.lang.IllegalStateException: Fragment already added: FragmentOne{423db570 #0 id=0x7f050006 fragOne}
public class MainActivity extends Activity implements View.OnClickListener {
private Button btnOne;
private Button btnTwo;
private Button btnThree;
/* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initialize();
if(findViewById(R.id.fl) != null){
if(savedInstanceState != null)
return;
}
FragmentManager.enableDebugLogging(true);
updateView("fragOne");
}
private void initialize(){
btnOne = (Button) findViewById(R.id.button1);
btnTwo = (Button) findViewById(R.id.button2);
btnThree = (Button) findViewById(R.id.button3);
btnOne.setOnClickListener(this);
btnTwo.setOnClickListener(this);
btnThree.setOnClickListener(this);
fragHolder = new HashMap<String, SoftReference<Fragment>>();
}
private void updateView(String tag){
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment frag = getFragmentManager().findFragmentByTag(tag);
boolean addToStack = true;
if(frag == null){
if(tag.equals("fragOne"))
frag = new FragmentOne();
else if(tag.equals("fragTwo"))
frag = new FragmentTwo();
else if(tag.equals("fragThree"))
frag = new FragmentThree();
}else{
//Don't add to back stack
addToStack = false;
}
ft.replace(R.id.fl, frag, tag);
if(addToStack)
ft.addToBackStack(null);
ft.commit();
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.button1:
updateView("fragOne");
break;
case R.id.button2:
updateView("fragTwo");
break;
case R.id.button3:
updateView("fragThree");
break;
}
}
}
你看過FragmentTransactions嗎?他們可能對你有幫助。 –