Remove the intermediary ViewGroup for support-v4 fragments
On Honeycomb and above the extra ViewGroup isn't needed
as we can use setSaveFromParentEnabled() like the framework
FragmentManager impl.
BUG: 17901056
Change-Id: I7b3cb130943f8f0e9ab7c910f86f5d711bd42f7a
diff --git a/v4/honeycomb/android/support/v4/view/ViewCompatHC.java b/v4/honeycomb/android/support/v4/view/ViewCompatHC.java
index 1c35bd3..47b461f 100644
--- a/v4/honeycomb/android/support/v4/view/ViewCompatHC.java
+++ b/v4/honeycomb/android/support/v4/view/ViewCompatHC.java
@@ -148,4 +148,8 @@
public static void jumpDrawablesToCurrentState(View view) {
view.jumpDrawablesToCurrentState();
}
+
+ public static void setSaveFromParentEnabled(View view, boolean enabled) {
+ view.setSaveFromParentEnabled(enabled);
+ }
}
diff --git a/v4/java/android/support/v4/app/FragmentManager.java b/v4/java/android/support/v4/app/FragmentManager.java
index 7116ee3..ee596f9 100644
--- a/v4/java/android/support/v4/app/FragmentManager.java
+++ b/v4/java/android/support/v4/app/FragmentManager.java
@@ -19,6 +19,7 @@
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.TypedArray;
+import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
@@ -28,6 +29,7 @@
import android.support.annotation.StringRes;
import android.support.v4.util.DebugUtils;
import android.support.v4.util.LogWriter;
+import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.util.Log;
import android.util.SparseArray;
@@ -921,7 +923,11 @@
f.mSavedFragmentState), null, f.mSavedFragmentState);
if (f.mView != null) {
f.mInnerView = f.mView;
- f.mView = NoSaveStateFrameLayout.wrap(f.mView);
+ if (Build.VERSION.SDK_INT >= 11) {
+ ViewCompat.setSaveFromParentEnabled(f.mView, false);
+ } else {
+ f.mView = NoSaveStateFrameLayout.wrap(f.mView);
+ }
if (f.mHidden) f.mView.setVisibility(View.GONE);
f.onViewCreated(f.mView, f.mSavedFragmentState);
} else {
@@ -948,7 +954,11 @@
f.mSavedFragmentState), container, f.mSavedFragmentState);
if (f.mView != null) {
f.mInnerView = f.mView;
- f.mView = NoSaveStateFrameLayout.wrap(f.mView);
+ if (Build.VERSION.SDK_INT >= 11) {
+ ViewCompat.setSaveFromParentEnabled(f.mView, false);
+ } else {
+ f.mView = NoSaveStateFrameLayout.wrap(f.mView);
+ }
if (container != null) {
Animation anim = loadAnimation(f, transit, true,
transitionStyle);
diff --git a/v4/java/android/support/v4/view/ViewCompat.java b/v4/java/android/support/v4/view/ViewCompat.java
index d883e00..a8445c9 100644
--- a/v4/java/android/support/v4/view/ViewCompat.java
+++ b/v4/java/android/support/v4/view/ViewCompat.java
@@ -332,6 +332,7 @@
public boolean getFitsSystemWindows(View view);
void jumpDrawablesToCurrentState(View v);
void setOnApplyWindowInsetsListener(View view, OnApplyWindowInsetsListener listener);
+ void setSaveFromParentEnabled(View view, boolean enabled);
}
static class BaseViewCompatImpl implements ViewCompatImpl {
@@ -724,6 +725,11 @@
OnApplyWindowInsetsListener listener) {
// noop
}
+
+ @Override
+ public void setSaveFromParentEnabled(View v, boolean enabled) {
+ // noop
+ }
}
static class EclairMr1ViewCompatImpl extends BaseViewCompatImpl {
@@ -893,6 +899,11 @@
public void jumpDrawablesToCurrentState(View view) {
ViewCompatHC.jumpDrawablesToCurrentState(view);
}
+
+ @Override
+ public void setSaveFromParentEnabled(View view, boolean enabled) {
+ ViewCompatHC.setSaveFromParentEnabled(view, enabled);
+ }
}
static class ICSViewCompatImpl extends HCViewCompatImpl {
@@ -2262,5 +2273,16 @@
IMPL.setOnApplyWindowInsetsListener(v, listener);
}
+ /**
+ * Controls whether the entire hierarchy under this view will save its
+ * state when a state saving traversal occurs from its parent.
+ *
+ * @param enabled Set to false to <em>disable</em> state saving, or true
+ * (the default) to allow it.
+ */
+ public static void setSaveFromParentEnabled(View v, boolean enabled) {
+ IMPL.setSaveFromParentEnabled(v, enabled);
+ }
+
// TODO: getters for various view properties (rotation, etc)
}