我有5个片段,其中两个是包含一些数据(昂贵的加载)的列表片段,其余的都没有任何重要的东西。管理片段事务,你不想丢失一些片段的数据
我的目标是如何管理事务,以便只有一个List片段保留在内存中(始终),当我按回它时应该还原回列表片段。 这是一些部分代码,它可以处理片段的on,但问题是当我按下它时不会卸载当前片段,而是在不移除当前片段的情况下加载Main Fragment。
工作流程: 主要片段(任务片段)在启动后加载,然后可以加载任何片段。 如果主要片段是电流和组片段被选中,那么除去否则,如果选择了任何其它片段然后保留(隐藏)主要片段的主要片段并装入新片段
注意:它被用于与导航抽屉其中1个片段在开始加载
public class FragmentController {
private static final String TAG_MAIN = "main"; //Expensive
private static final String TAG_GROUP = "group"; //Expensive
private static final String TAG_PROFILE = "profile"; //Cheap
private static final String TAG_CREATE_TASK = "create_task"; //Cheap
private static final String TAG_CREATE_GROUP = "create_group";//Cheap
private static final String TAG_SETTINGS = "settings"; //Cheap
private android.support.v4.app.FragmentManager fragmentManager;
@IdRes private int container;
public FragmentController(android.support.v4.app.FragmentManager fragmentManager, @IdRes int container) {
this.fragmentManager = fragmentManager;
this.container = container;
}
public void showMainFragment() {
FragmentTransaction transaction = fragmentManager.beginTransaction();
if (containsMainFragment()) {
if (!isMainCurrent()) {
transaction
.show(getMainFragment())
.commit();
}
} else {
transaction
.replace(container, getMainFragment(), TAG_MAIN)
.commit();
}
}
public void showGroupFragment() {
FragmentTransaction transaction = fragmentManager.beginTransaction();
if (containsGroupFragment()) {
if (!isGroupCurrent()) {
transaction
.show(getGroupFragment())
.commit();
}
} else {
transaction
.replace(container, getGroupFragment(), TAG_GROUP)
.commit();
}
}
public void showProfileFragment() {
showLightFragment(ProfileFragment.newInstance(), TAG_PROFILE);
}
public void showCreateTaskFragment() {
showLightFragment(CreateTaskFragment.newInstance(), TAG_CREATE_TASK);
}
public void showCreateGroupFragment() {
showLightFragment(CreateGroupFragment.newInstance(), TAG_CREATE_GROUP);
}
public void showSettingsFragment() {
showLightFragment(SettingsFragment.newInstance(), TAG_SETTINGS);
}
private void showLightFragment(Fragment fragmentInstance, String tag) {
FragmentTransaction transaction = fragmentManager.beginTransaction();
Fragment fragment = getCurrentFragment();
if (containsListFragment() && (isMainCurrent() || isGroupCurrent())) {
assert fragment != null;
transaction = transaction
.hide(fragment)
.add(container, fragmentInstance, tag)
.addToBackStack(tag);
} else {
transaction = transaction
.remove(fragment)
.add(container, fragmentInstance, tag);
}
if(isCreateTaskFragment(fragment)){
transaction = transaction
.addToBackStack(tag);
}
transaction.commit();
}
private boolean containsListFragment() {
return getFragmentByTag(TAG_MAIN) != null || getFragmentByTag(TAG_GROUP) != null;
}
private boolean containsMainFragment() {
return getFragmentByTag(TAG_MAIN) != null;
}
private boolean containsGroupFragment() {
return getFragmentByTag(TAG_GROUP) != null;
}
private Fragment getMainFragment() {
Fragment fragment = getFragmentByTag(TAG_MAIN);
if (fragment == null) {
fragment = TasksFragment.newInstance();
}
return fragment;
}
private Fragment getGroupFragment() {
Fragment fragment = getFragmentByTag(TAG_GROUP);
if (fragment == null) {
fragment = GroupTasksFragment.newInstance();
}
return fragment;
}
private Fragment getFragmentByTag(String tag) {
return fragmentManager.findFragmentByTag(tag);
}
private Fragment getCurrentFragment() {
return fragmentManager.findFragmentById(container);
}
private boolean isMainCurrent() { return isCurrent(TAG_MAIN); }
private boolean isGroupCurrent() {
return isCurrent(TAG_GROUP);
}
private boolean isCurrent(String tag) {
Fragment fragment = getCurrentFragment();
return fragment != null && fragment.getTag() != null && fragment.getTag().equals(tag);
}
private boolean isCreateTaskFragment(Fragment fragment){
return fragment!=null && fragment.getTag()!=null && fragment.getTag().equals(TAG_CREATE_TASK);
}
}
您是否尝试过调试该应用程序?我怀疑你的showMainFragment算法存在问题。您可以在调试应用程序时在android studio中监听片段堆栈。 – jdesesquelles
@jdesesquelles我有,但这个问题是有点相关的后台它做它应该做的事情,但不分离以前没有看到后台堆栈添加片段 –
很难说。如果你可以分享你的代码,我会看看。你可以在这里找到灵感:https://github.com/SimonVT/cathode。处理碎片的一个例子。 – jdesesquelles