Be more blunt about saving the right fragment reference

Apparently fragment IDs get recycled so storing the fragment reference
in a bundle can return the wrong fragment later, so that's great.

b/14094356

Change-Id: I7ce4ae46f51371b4179c7e85c343ab86162b5a95
This commit is contained in:
Tony Mantler 2014-04-16 10:05:44 -07:00
parent 03d600caac
commit 91ad26315a
1 changed files with 6 additions and 23 deletions

View File

@ -115,9 +115,8 @@ public class AccountSettings extends PreferenceActivity implements
private long mRequestedAccountId; private long mRequestedAccountId;
private Header[] mAccountListHeaders; private Header[] mAccountListHeaders;
private Header mAppPreferencesHeader; private Header mAppPreferencesHeader;
private static final String CURRENT_SETTINGS_FRAGMENT_TAG = "currentSettingsFragment"; private AccountSettingsFragment mAccountSettingsFragment;
private static final String CURRENT_SERVER_FRAGMENT_TAG = "currentServerFragment"; private AccountServerBaseFragment mAccountServerFragment;
private Bundle mCurrentFragmentBundle = new Bundle(2);
private long mDeletingAccountId = -1; private long mDeletingAccountId = -1;
private boolean mShowDebugMenu; private boolean mShowDebugMenu;
private List<Header> mGeneratedHeaders; private List<Header> mGeneratedHeaders;
@ -606,12 +605,10 @@ public class AccountSettings extends PreferenceActivity implements
if (f instanceof AccountSettingsFragment) { if (f instanceof AccountSettingsFragment) {
final AccountSettingsFragment asf = (AccountSettingsFragment) f; final AccountSettingsFragment asf = (AccountSettingsFragment) f;
getFragmentManager() mAccountSettingsFragment = asf;
.putFragment(mCurrentFragmentBundle, CURRENT_SETTINGS_FRAGMENT_TAG, f);
asf.setCallback(mAccountSettingsFragmentCallback); asf.setCallback(mAccountSettingsFragmentCallback);
} else if (f instanceof AccountServerBaseFragment) { } else if (f instanceof AccountServerBaseFragment) {
getFragmentManager() mAccountServerFragment = (AccountServerBaseFragment) f;
.putFragment(mCurrentFragmentBundle, CURRENT_SERVER_FRAGMENT_TAG, f);
} else { } else {
// Possibly uninteresting fragment, such as a dialog. // Possibly uninteresting fragment, such as a dialog.
return; return;
@ -622,25 +619,11 @@ public class AccountSettings extends PreferenceActivity implements
@VisibleForTesting @VisibleForTesting
protected AccountSettingsFragment getSettingsFragment() { protected AccountSettingsFragment getSettingsFragment() {
try { return mAccountSettingsFragment;
return (AccountSettingsFragment)
getFragmentManager().getFragment(mCurrentFragmentBundle,
CURRENT_SETTINGS_FRAGMENT_TAG);
} catch (final IllegalStateException e) {
LogUtils.d(LogUtils.TAG, e, "Could not find current settings fragment, returning null");
return null;
}
} }
protected AccountServerBaseFragment getAccountServerFragment() { protected AccountServerBaseFragment getAccountServerFragment() {
try { return mAccountServerFragment;
return (AccountServerBaseFragment)
getFragmentManager().getFragment(mCurrentFragmentBundle,
CURRENT_SERVER_FRAGMENT_TAG);
} catch (final IllegalStateException e) {
LogUtils.d(LogUtils.TAG, e, "Could not find current server fragment, returning null");
return null;
}
} }
/** /**