OSDN Git Service

Allow Views to specify a theme override
authorAlan Viverette <alanv@google.com>
Fri, 3 Jan 2014 23:22:53 +0000 (15:22 -0800)
committerAlan Viverette <alanv@google.com>
Fri, 3 Jan 2014 23:22:53 +0000 (15:22 -0800)
During inflation, any view with a theme attribute will wrap its context
with a theme override. Views inflated using a parent will inherit the
wrapped context.

BUG: 12178430
Change-Id: I3448e5174e94c19960a1e21df5bd6127d0d33c07

core/java/android/view/LayoutInflater.java

index aa43bad..32c9885 100644 (file)
@@ -91,6 +91,8 @@ public abstract class LayoutInflater {
     private static final String TAG_1995 = "blink";
     private static final String TAG_REQUEST_FOCUS = "requestFocus";
 
+    private static final String ATTR_THEME = "theme";
+
     /**
      * Hook to allow clients of the LayoutInflater to restrict the set of Views that are allowed
      * to be inflated.
@@ -677,23 +679,44 @@ public abstract class LayoutInflater {
             name = attrs.getAttributeValue(null, "class");
         }
 
+        // Apply a theme override, if necessary.
+        final Context viewContext;
+        final int themeResId = attrs.getAttributeResourceValue(null, ATTR_THEME, 0);
+        if (themeResId != 0) {
+            viewContext = new ContextThemeWrapper(mContext, themeResId);
+        } else if (parent != null) {
+            viewContext = parent.getContext();
+        } else {
+            viewContext = mContext;
+        }
+
         if (DEBUG) System.out.println("******** Creating view: " + name);
 
         try {
             View view;
-            if (mFactory2 != null) view = mFactory2.onCreateView(parent, name, mContext, attrs);
-            else if (mFactory != null) view = mFactory.onCreateView(name, mContext, attrs);
-            else view = null;
+            if (mFactory2 != null) {
+                view = mFactory2.onCreateView(parent, name, viewContext, attrs);
+            } else if (mFactory != null) {
+                view = mFactory.onCreateView(name, viewContext, attrs);
+            } else {
+                view = null;
+            }
 
             if (view == null && mPrivateFactory != null) {
-                view = mPrivateFactory.onCreateView(parent, name, mContext, attrs);
+                view = mPrivateFactory.onCreateView(parent, name, viewContext, attrs);
             }
-            
+
             if (view == null) {
-                if (-1 == name.indexOf('.')) {
-                    view = onCreateView(parent, name, attrs);
-                } else {
-                    view = createView(name, null, attrs);
+                final Object lastContext = mConstructorArgs[0];
+                mConstructorArgs[0] = viewContext;
+                try {
+                    if (-1 == name.indexOf('.')) {
+                        view = onCreateView(parent, name, attrs);
+                    } else {
+                        view = createView(name, null, attrs);
+                    }
+                } finally {
+                    mConstructorArgs[0] = lastContext;
                 }
             }