使用NavigationDrawer切换时,如何只保留片段的一个实例?

Mic*_*idt 11 android android-fragments

我的应用程序以AddressFragment开头.从NavigationDrawer我开始(以及其他)一个新的 AddressFragment:

getSupportFragmentManager().beginTransaction()
                .replace(R.id.container, new AddressFragment())
                .addToBackStack(null)
                .commit();
Run Code Online (Sandbox Code Playgroud)

但我宁愿回到第一个实例.我怎么能这样做?

或者更一般,我怎样才能找出片段的实例是否已经存在然后开始,如果是,否则创建一个?

Sim*_*mas 20

在创建片段时为其设置标记,稍后您可以通过片段管理器找到它并相应地替换/创建.

FragmentManager fManager = getFragmentManager();
FragmentTransaction fTransaction = fManager.beginTransaction();
Fragment fragment = fManager.findFragmentByTag("uniqueTag");

// If fragment doesn't exist yet, create one
if (fragment == null) {
    fTransaction.add(R.id.fragment_list, new ListFrag(), "uniqueTag");
}
else { // re-use the old fragment
    fTransaction.replace(R.id.fragment_list, fragment, "uniqueTag");
}
Run Code Online (Sandbox Code Playgroud)


Tob*_*run 6

第一步:

优化当前代码以允许Fragment拥有自己的"TAG"

getSupportFragmentManager().beginTransaction()
                .replace(R.id.container, new AddressFragment())
                .addToBackStack(**AddressFragment.class.getName()**)
                .commit();
Run Code Online (Sandbox Code Playgroud)

第二步:

在应用程序流程的某处,您需要确定是否存在片段:

public static boolean isFragmentInBackstack(final FragmentManager fragmentManager, final String fragmentTagName) {
    for (int entry = 0; entry < fragmentManager.getBackStackEntryCount(); entry++) {
        if (fragmentTagName.equals(fragmentManager.getBackStackEntryAt(entry).getName())) {
            return true;
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

第三步:

执行片段动作

if (exists) {
    // Fragment exists, go back to that fragment
    //// you can also use POP_BACK_STACK_INCLUSIVE flag, depending on flow
    mFragmentManager.popBackStackImmediate(AddressFragment.class.getName(), 0);

} else {
    // Fragment doesn't exist
    // STEP 1 + additional backstack management
}
Run Code Online (Sandbox Code Playgroud)