gpt4 book ai didi

java - 如何保存和重用相同的 fragment 实例?

转载 作者:太空狗 更新时间:2023-10-29 22:58:26 28 4
gpt4 key购买 nike

我最近开始使用 fragment 创建了一个演示应用程序,如下所示:

Demo App

单击每个按钮可在 fragment 1、 fragment 2 和 fragment 3 之间切换。

我想要完成的是每个 fragment 只有 1 个实例并重用它。 (请注意,所有 fragment 都是动态创建和添加的)。目前,我正在通过创建 fragment 的 HashMap 并放置每个实例并从那里获取它来做到这一点。

所以我的问题是:有没有更好的方法:通过使用 FragmentManager 的 putFragment(...) 方法? putFragment (Bundle bundle, String key, Fragment fragment) 我不知道如何在我的案例中使用它。如果有人能给我一个如何使用这种方法的例子。

在我的 Activity 中保留每个 fragment 的引用是否昂贵?这会让所有的 fragment 都活着吗?我正在使用软引用来解决这个问题,但我不确定这是否是正确的方法。请指出执行此操作的任何替代方法,或者让我知道这是否是完成此操作的最佳方法。

提前致谢。

这是我的代码:

更新:我正在尝试重用后台堆栈中的 fragment ,尝试仅在后台堆栈中不存在时才添加它们。下面的代码在我离开 fragment 一后给出了非法状态异常 ->返回它 ->然后尝试按下后退按钮:

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;
}
}
}

最佳答案

为了演示FragmentTransaction,以下示例可能对您有所帮助。

首先,您想在 Activity 的 onCreate() 中完成所有初始化工作,这是您的权利,但我们会做一些更改。

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)
{
FragmentTransaction trans = getFragmentManager().beginTransaction();

//This is where we add our first fragment
trans.add(R.id.fl, new FragmentOne());
trans.commit();
}
}
}

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);
}

public void onClick(View view)
{
//Here is where we'll actually transfer the fragments

FragmentTransaction trans = getFragmentManager().beginTransaction();
switch(v.getId()){
case R.id.button1:
trans.replace(R.id.fl, new FragmentOne());
trans.addToBackStack(null);
trans.commit();
break;
case R.id.button2:
trans.replace(R.id.fl, new FragmentTwo());
trans.addToBackStack(null);
trans.commit();
break;
case R.id.button3:
trans.replace(R.id.fl, new FragmentThree());
trans.addToBackStack(null);
trans.commit();
break;
}
}

这将使您可以轻松地从一个 Fragment 过渡到下一个。

关于java - 如何保存和重用相同的 fragment 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19614300/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com