diff --git a/src/android/support/design/widget/AppBarLayout.java b/src/android/support/design/widget/AppBarLayout.java index 53e96ba98..3f60522e9 100644 --- a/src/android/support/design/widget/AppBarLayout.java +++ b/src/android/support/design/widget/AppBarLayout.java @@ -142,6 +142,8 @@ public class AppBarLayout extends LinearLayout { super(context, attrs); setOrientation(VERTICAL); + ThemeUtils.checkAppCompatTheme(context); + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.AppBarLayout, 0, R.style.Widget_Design_AppBarLayout); mTargetElevation = a.getDimensionPixelSize(R.styleable.AppBarLayout_elevation, 0); diff --git a/src/android/support/design/widget/CollapsingToolbarLayout.java b/src/android/support/design/widget/CollapsingToolbarLayout.java index 230a1d0fb..5c65e5195 100644 --- a/src/android/support/design/widget/CollapsingToolbarLayout.java +++ b/src/android/support/design/widget/CollapsingToolbarLayout.java @@ -126,6 +126,8 @@ public class CollapsingToolbarLayout extends FrameLayout { public CollapsingToolbarLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); + ThemeUtils.checkAppCompatTheme(context); + mCollapsingTextHelper = new CollapsingTextHelper(this); mCollapsingTextHelper.setTextSizeInterpolator(AnimationUtils.DECELERATE_INTERPOLATOR); diff --git a/src/android/support/design/widget/CoordinatorLayout.java b/src/android/support/design/widget/CoordinatorLayout.java index cd1f2acc1..04b9ecebd 100644 --- a/src/android/support/design/widget/CoordinatorLayout.java +++ b/src/android/support/design/widget/CoordinatorLayout.java @@ -168,6 +168,8 @@ public class CoordinatorLayout extends ViewGroup implements NestedScrollingParen public CoordinatorLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); + ThemeUtils.checkAppCompatTheme(context); + final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CoordinatorLayout, defStyleAttr, R.style.Widget_Design_CoordinatorLayout); final int keylineArrayRes = a.getResourceId(R.styleable.CoordinatorLayout_keylines, 0); diff --git a/src/android/support/design/widget/FloatingActionButton.java b/src/android/support/design/widget/FloatingActionButton.java index 9a7b72725..9240f1223 100644 --- a/src/android/support/design/widget/FloatingActionButton.java +++ b/src/android/support/design/widget/FloatingActionButton.java @@ -82,6 +82,8 @@ public class FloatingActionButton extends ImageView { public FloatingActionButton(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); + ThemeUtils.checkAppCompatTheme(context); + mShadowPadding = new Rect(); TypedArray a = context.obtainStyledAttributes(attrs, diff --git a/src/android/support/design/widget/NavigationView.java b/src/android/support/design/widget/NavigationView.java index 4e325fa5a..45fd0888f 100644 --- a/src/android/support/design/widget/NavigationView.java +++ b/src/android/support/design/widget/NavigationView.java @@ -95,6 +95,8 @@ public class NavigationView extends ScrimInsetsFrameLayout { public NavigationView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); + ThemeUtils.checkAppCompatTheme(context); + // Create the menu mMenu = new NavigationMenu(context); diff --git a/src/android/support/design/widget/Snackbar.java b/src/android/support/design/widget/Snackbar.java index 9d7878f0c..669d394fa 100644 --- a/src/android/support/design/widget/Snackbar.java +++ b/src/android/support/design/widget/Snackbar.java @@ -181,6 +181,8 @@ public final class Snackbar { mParent = parent; mContext = parent.getContext(); + ThemeUtils.checkAppCompatTheme(mContext); + LayoutInflater inflater = LayoutInflater.from(mContext); mView = (SnackbarLayout) inflater.inflate(R.layout.design_layout_snackbar, mParent, false); } diff --git a/src/android/support/design/widget/TabLayout.java b/src/android/support/design/widget/TabLayout.java index abbf3bfde..7897bbec6 100755 --- a/src/android/support/design/widget/TabLayout.java +++ b/src/android/support/design/widget/TabLayout.java @@ -222,6 +222,8 @@ public class TabLayout extends HorizontalScrollView { public TabLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); + ThemeUtils.checkAppCompatTheme(context); + // Disable the Scroll Bar setHorizontalScrollBarEnabled(false); // Set us to fill the View port diff --git a/src/android/support/design/widget/TextInputLayout.java b/src/android/support/design/widget/TextInputLayout.java index 282634446..94f5a48d3 100644 --- a/src/android/support/design/widget/TextInputLayout.java +++ b/src/android/support/design/widget/TextInputLayout.java @@ -85,6 +85,8 @@ public class TextInputLayout extends LinearLayout { // Can't call through to super(Context, AttributeSet, int) since it doesn't exist on API 10 super(context, attrs); + ThemeUtils.checkAppCompatTheme(context); + setOrientation(VERTICAL); setWillNotDraw(false); setAddStatesFromChildren(true); diff --git a/src/android/support/design/widget/ThemeUtils.java b/src/android/support/design/widget/ThemeUtils.java new file mode 100644 index 000000000..327a44d7d --- /dev/null +++ b/src/android/support/design/widget/ThemeUtils.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.support.design.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.support.design.R; + +class ThemeUtils { + + private static final int[] APPCOMPAT_CHECK_ATTRS = { R.attr.colorPrimary }; + + static void checkAppCompatTheme(Context context) { + TypedArray a = context.obtainStyledAttributes(APPCOMPAT_CHECK_ATTRS); + final boolean failed = !a.hasValue(0); + if (a != null) { + a.recycle(); + } + if (failed) { + throw new IllegalArgumentException("You need to use a Theme.AppCompat theme " + + "(or descendant) with the design library."); + } + } +}