Nav*_*eed 15 java android android-fragments
我最近开始使用片段创建了一个演示应用程序,如下所示:

单击每个按钮可在片段1,片段2和片段3之间切换.
我想要完成的是每个Fragment只有一个实例并重用它.(请注意,所有片段都是动态创建和添加的).目前我这样做是通过创建片段的HashMap并放置每个实例并从那里抓取它.
所以我的问题是:有没有更好的方法:使用FragmentManager的putFragment(...)方法?putFragment (Bundle bundle, String key, 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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
为了演示FragmentTransaction,以下示例可能对您有所帮助。
首先,您想要在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;
}
}
Run Code Online (Sandbox Code Playgroud)
这将使您能够轻松地从一个片段过渡到下一个片段。
| 归档时间: |
|
| 查看次数: |
16552 次 |
| 最近记录: |