在我的程序中我有一些片段,我可以通过点击该代码替换每个片段.我的问题是:这些片段加载很少,点击每个片段后,从中创建新片段并在点击片段后再次加载.如何保存片段内容或状态并防止重新加载?
@Override
public void onNavigationDrawerItemSelected(int position) {
Fragment fragment = null;
switch (position) {
case 0:
fragment = new InfoFragment();
break;
case 1:
fragment = new ParentOtoFragment();
break;
case 2:
fragment = new ParentProFragment();
break;
case 3:
fragment = new SupportFragment();
break;
case 4:
fragment = new AboutFragment();
break;
}
if (fragment != null){
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container,fragment).commit();
}
}
Run Code Online (Sandbox Code Playgroud)
更新后
在@Vikram Ezhil回复此主题之后我是首字母fragments并fragmentTAG进入构造函数并将@Vikram Ezhil代码更改为以下代码,我的问题解决了.
@Override
public void onNavigationDrawerItemSelected(int position) {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
if (getSupportFragmentManager().findFragmentByTag(fragmentTAGS[position]) == null) {
fragmentTransaction.add(R.id.container, fragments[position], fragmentTAGS[position]);
}
for (int i = 0; i < fragments.length; i++) {
if (i == position) {
fragmentTransaction.show(fragments[i]);
} else {
if (getSupportFragmentManager().findFragmentByTag(fragmentTAGS[position]) != null) {
fragmentTransaction.hide(fragments[i]);
}
}
}
fragmentTransaction.commit();
}
Run Code Online (Sandbox Code Playgroud)
每次单击导航抽屉中的项目时,都要防止碎片从头开始重新创建
fragmentTransaction.add(R.id.container,fragment).commit();
Run Code Online (Sandbox Code Playgroud)
代替
fragmentTransaction.replace(R.id.container,fragment).commit();
Run Code Online (Sandbox Code Playgroud)
但是,添加片段而不是替换片段时需要一些额外的工作.
您需要确保不会多次添加相同的片段.您可以放置片段TAG并在添加片段之前检查TAG是否存在.例,
if (getFragmentManager().findFragmentByTag("fragment1_tag") == null)
{
fragmentTransaction.add(R.id.container, fragment1, "fragment1_tag");
}
Run Code Online (Sandbox Code Playgroud)您需要隐藏未显示的片段,因为当您开始添加片段时,它们将在屏幕上相互重叠.
if (getFragmentManager().findFragmentByTag("fragment1_tag") != null)
{
fragmentTransaction.hide(fragment1);
}
Run Code Online (Sandbox Code Playgroud)每当要更新片段中的特定部分时,请使用接口方法.我不会深入研究这一点,因为这完全是一个不同的主题.
一旦应用程序被Android操作系统杀死,确保你的碎片没有重叠,为其他应用程序分配内存(查看这篇文章了解更多信息).
还添加了一些建议 - 从上面的代码中,您只有一个片段变量,并为所有5个屏幕重新使用它.我建议你为5个屏幕分别设置片段变量并保存一个数组.
当你开始添加,隐藏,显示片段时,这样做的原因将更加容易和通用.例,
InfoFragment fragment1 = new InfoFragment();
ParentOtoFragment fragment2 = new ParentOtoFragment();
ParentProFragment fragment3 = new ParentProFragment();
SupportFragment fragment4 = new SupportFragment();
AboutFragment fragment5 = new AboutFragment();
Fragment[] fragments = new Fragment[]{fragment1,fragment2,fragment3,fragment4,fragment5};
String[] fragmentTAGS = new String[]{"fragment1_tag","fragment2_tag","fragment3_tag","fragment4_tag","fragment5_tag"};
Run Code Online (Sandbox Code Playgroud)
现在使用上述内容,您可以根据从导航栏中单击的项目切换片段.
@Override
public void onNavigationDrawerItemSelected(int position)
{
// Add the fragments only once if array haven't fragment
if (getFragmentManager().findFragmentByTag(fragmentTAGS[position]) == null)
{
fragmentTransaction.add(R.id.container,fragments[position],fragmentTAGS[position]);
};
// Hiding & Showing fragments
for(int catx=0;catx<fragments.length;catx++)
{
if(catx == position)
{
fragmentTransaction.show(fragments[catx]);
}
else
{
// Check if the fragment is added and then hide it
if (getFragmentManager().findFragmentByTag(fragmentTAGS[catx]) != null)
{
fragmentTransaction.hide(fragments[catx]);
};
};
};
fragmentTransaction.commit();
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1874 次 |
| 最近记录: |