Fragment.getArguments() возвращает переданные аргументы после изменений конфигурации?
Извините за мой английский
Должен ли я сохранить и восстановить аргументы (возвращается getArguments()
) во время изменения конфигурации через outState
\ savedInstanceState
?
Или же getArguments()
всегда возвращает переданные аргументы даже после изменения конфигурации?
4 ответа
Короткий ответ
Я могу только ответить Нет.
Полный ответ
Вам не нужно сохранять свои аргументы, это будет сделано автоматически.
Вот почему: (возможно я не прав, но исходный код говорит об этом:)
В Android поддержка библиотеки v4
Android-SDK / дополнения / Android / поддержка / v4 / SRC / Java / Android / поддержка / v4 / приложение / Fragment.java
У вас есть метод:
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mClassName);
dest.writeInt(mIndex);
dest.writeInt(mFromLayout ? 1 : 0);
dest.writeInt(mFragmentId);
dest.writeInt(mContainerId);
dest.writeString(mTag);
dest.writeInt(mRetainInstance ? 1 : 0);
dest.writeInt(mDetached ? 1 : 0);
dest.writeBundle(mArguments);//<---------------------------- Look here
dest.writeBundle(mSavedFragmentState);
}
куда mArgument
является:
/**
* Supply the construction arguments for this fragment. This can only
* be called before the fragment has been attached to its activity; that
* is, you should call it immediately after constructing the fragment. The
* arguments supplied here will be retained across fragment destroy and
* creation.
*/
public void setArguments(Bundle args) {
if (mIndex >= 0) {
throw new IllegalStateException("Fragment already active");
}
mArguments = args;
}
И в
/**
* State information that has been retrieved from a fragment instance
* through {@link FragmentManager#saveFragmentInstanceState(Fragment)
* FragmentManager.saveFragmentInstanceState}.
*/
public static class SavedState implements Parcelable {
final Bundle mState;
SavedState(Bundle state) {
mState = state;
}
SavedState(Parcel in, ClassLoader loader) {
mState = in.readBundle();
if (loader != null && mState != null) {
mState.setClassLoader(loader);
}
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeBundle(mState);
}
public static final Parcelable.Creator<SavedState> CREATOR
= new Parcelable.Creator<SavedState>() {
public SavedState createFromParcel(Parcel in) {
return new SavedState(in, null);
}
public SavedState[] newArray(int size) {
return new SavedState[size];
}
};
}
это выполнено. Как в комментарии вы можете прочитать это используется:). Также я проверил код и да, он сохранен.
В FragmentManager.java
@Override
public Fragment.SavedState saveFragmentInstanceState(Fragment fragment) {
if (fragment.mIndex < 0) {
throwException( new IllegalStateException("Fragment " + fragment
+ " is not currently in the FragmentManager"));
}
if (fragment.mState > Fragment.INITIALIZING) {
Bundle result = saveFragmentBasicState(fragment);
return result != null ? new Fragment.SavedState(result) : null;
}
return null;
}
Также я проверил это несколько раз на Android, и он все еще выглядит, что он работает:)
Да, Android сохраняет переданные аргументы после изменения конфигурации.
Кажется, это так. Проверьте здесь
Это говорит;
Укажите аргументы конструкции для этого фрагмента. Это можно вызвать только до того, как фрагмент был прикреплен к его активности; то есть вы должны вызывать его сразу после создания фрагмента. Аргументы, представленные здесь, будут сохранены при уничтожении и создании фрагмента.
Вы хотите сделать это изменение конфигурации или нет. в файле манифеста вы можете сделать эту запись, чтобы избежать изменений