我最近开始使用片段,并创建了一个演示应用程序,看起来像这样:
点击每个按钮将切换到 Fragment 1、Fragment 2 和 Fragment 3。
我想要实现的是,只有每个 Fragment 的一个实例并重用它。(请注意,所有的片段都是动态创建和添加的。)我目前是通过创建 Fragment 的 HashMap 并放置每个实例以及从中获取它来实现这一点。
所以我的问题是:
有没有更好的方法来实现这一点:
通过使用 FragmentManager 的 putFragment(...) 方法?putFragment (Bundle bundle, String key, Fragment fragment)
我无法弄清楚如何在我的情况下使用它。如果有人可以给我一个如何使用此方法的示例,那就太好了。
保持对每个片段的引用在我的活动中是否会消耗大量资源? 这是否会使所有片段保持活动状态?我正在使用软引用来解决这个问题,但我不确定这是否是正确的做法。请告诉我是否有其他更好的方法来实现这一点或让我知道这是最好的方法。
提前感谢您的帮助。
以下是我的代码:
更新: 我正在尝试从后堆栈中重用片段,仅在后堆栈中不存在它们时才添加它们。在我离开 Fragment 1 -> 回来 -> 然后尝试按返回按钮时,下面的代码会给我一个非法状态异常:
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;
}
}
}