From 8b1f6731c2bc7d666dea65945ce33901ab5348f7 Mon Sep 17 00:00:00 2001 From: Rey Pham Date: Thu, 2 Apr 2015 11:40:24 +0700 Subject: [PATCH] Add applyStyle() method so view can change style dynamically. --- .../java/com/rey/material/util/ThemeUtil.java | 10 + .../java/com/rey/material/widget/Button.java | 16 +- .../com/rey/material/widget/CheckBox.java | 12 +- .../rey/material/widget/CheckedTextView.java | 12 +- .../rey/material/widget/CompoundButton.java | 11 +- .../com/rey/material/widget/EditText.java | 291 +++++++++--------- .../com/rey/material/widget/ImageButton.java | 14 +- .../com/rey/material/widget/ProgressView.java | 48 +-- .../com/rey/material/widget/RadioButton.java | 12 +- .../com/rey/material/widget/SnackBar.java | 7 +- .../java/com/rey/material/widget/Spinner.java | 91 +++--- .../java/com/rey/material/widget/Switch.java | 4 + .../rey/material/widget/TabPageIndicator.java | 66 ++-- .../com/rey/material/widget/TextView.java | 16 +- 14 files changed, 365 insertions(+), 245 deletions(-) diff --git a/lib/src/main/java/com/rey/material/util/ThemeUtil.java b/lib/src/main/java/com/rey/material/util/ThemeUtil.java index bd2f600d..4beb3ae1 100644 --- a/lib/src/main/java/com/rey/material/util/ThemeUtil.java +++ b/lib/src/main/java/com/rey/material/util/ThemeUtil.java @@ -5,6 +5,7 @@ import android.content.res.Resources.Theme; import android.content.res.TypedArray; import android.os.Build; +import android.support.v7.internal.widget.TintTypedArray; import android.util.TypedValue; import com.rey.material.R; @@ -121,4 +122,13 @@ public static int getType(TypedArray array, int index){ } } + public static CharSequence getString(TypedArray array, int index, CharSequence defaultValue){ + String result = array.getString(index); + return result == null ? defaultValue : result; + } + + public static CharSequence getString(TintTypedArray array, int index, CharSequence defaultValue){ + String result = array.getString(index); + return result == null ? defaultValue : result; + } } diff --git a/lib/src/main/java/com/rey/material/widget/Button.java b/lib/src/main/java/com/rey/material/widget/Button.java index 467932d7..5fbf4f11 100644 --- a/lib/src/main/java/com/rey/material/widget/Button.java +++ b/lib/src/main/java/com/rey/material/widget/Button.java @@ -37,10 +37,18 @@ public Button(Context context, AttributeSet attrs, int defStyleAttr, int defStyl } private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ - mRippleManager.onCreate(this, context, attrs, defStyleAttr, defStyleRes); - } - - @Override + applyStyle(context, attrs, defStyleAttr, defStyleRes); + } + + public void applyStyle(int resId){ + applyStyle(getContext(), null, 0, resId); + } + + private void applyStyle(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ + mRippleManager.onCreate(this, context, attrs, defStyleAttr, defStyleRes); + } + + @Override public void setOnClickListener(OnClickListener l) { if(l == mRippleManager) super.setOnClickListener(l); diff --git a/lib/src/main/java/com/rey/material/widget/CheckBox.java b/lib/src/main/java/com/rey/material/widget/CheckBox.java index cc2b5670..c19075b1 100644 --- a/lib/src/main/java/com/rey/material/widget/CheckBox.java +++ b/lib/src/main/java/com/rey/material/widget/CheckBox.java @@ -32,8 +32,16 @@ public CheckBox(Context context, AttributeSet attrs, int defStyleAttr, int defSt } private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ - CheckBoxDrawable drawable = new CheckBoxDrawable.Builder(context, attrs, defStyleAttr, defStyleRes).build(); - drawable.setInEditMode(isInEditMode()); + applyStyle(context, attrs, defStyleAttr, defStyleRes); + } + + public void applyStyle(int resId){ + applyStyle(getContext(), null, 0, resId); + } + + private void applyStyle(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ + CheckBoxDrawable drawable = new CheckBoxDrawable.Builder(context, attrs, defStyleAttr, defStyleRes).build(); + drawable.setInEditMode(isInEditMode()); drawable.setAnimEnable(false); setButtonDrawable(drawable); drawable.setAnimEnable(true); diff --git a/lib/src/main/java/com/rey/material/widget/CheckedTextView.java b/lib/src/main/java/com/rey/material/widget/CheckedTextView.java index bba81572..9340dfef 100644 --- a/lib/src/main/java/com/rey/material/widget/CheckedTextView.java +++ b/lib/src/main/java/com/rey/material/widget/CheckedTextView.java @@ -34,8 +34,16 @@ public CheckedTextView(Context context, AttributeSet attrs, int defStyleAttr, in } private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ - mRippleManager.onCreate(this, context, attrs, defStyleAttr, defStyleRes); - } + applyStyle(context, attrs, defStyleAttr, defStyleRes); + } + + public void applyStyle(int resId){ + applyStyle(getContext(), null, 0, resId); + } + + private void applyStyle(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ + mRippleManager.onCreate(this, context, attrs, defStyleAttr, defStyleRes); + } @Override public void setOnClickListener(OnClickListener l) { diff --git a/lib/src/main/java/com/rey/material/widget/CompoundButton.java b/lib/src/main/java/com/rey/material/widget/CompoundButton.java index edfa24b0..6dc3eb9d 100644 --- a/lib/src/main/java/com/rey/material/widget/CompoundButton.java +++ b/lib/src/main/java/com/rey/material/widget/CompoundButton.java @@ -40,8 +40,6 @@ public CompoundButton(Context context, AttributeSet attrs, int defStyleAttr, int @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ - mRippleManager.onCreate(this, context, attrs, defStyleAttr, defStyleRes); - //a fix to reset paddingLeft attribute if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1){ TypedArray a = context.obtainStyledAttributes(attrs, new int[]{android.R.attr.padding, android.R.attr.paddingLeft}, defStyleAttr, defStyleRes); @@ -53,7 +51,16 @@ private void init(Context context, AttributeSet attrs, int defStyleAttr, int def } setClickable(true); + applyStyle(context, attrs, defStyleAttr, defStyleRes); } + + public void applyStyle(int resId){ + applyStyle(getContext(), null, 0, resId); + } + + private void applyStyle(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ + mRippleManager.onCreate(this, context, attrs, defStyleAttr, defStyleRes); + } @Override public void setOnClickListener(OnClickListener l) { diff --git a/lib/src/main/java/com/rey/material/widget/EditText.java b/lib/src/main/java/com/rey/material/widget/EditText.java index 05685aea..824284d9 100644 --- a/lib/src/main/java/com/rey/material/widget/EditText.java +++ b/lib/src/main/java/com/rey/material/widget/EditText.java @@ -115,10 +115,23 @@ public EditText(Context context, AttributeSet attrs, int defStyleAttr, int defSt @SuppressWarnings("deprecation") @TargetApi(Build.VERSION_CODES.JELLY_BEAN) private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.EditText, defStyleAttr, defStyleRes); - - mLabelEnable = a.getBoolean(R.styleable.EditText_et_labelEnable, false); - mSupportMode = a.getInteger(R.styleable.EditText_et_supportMode, SUPPORT_MODE_NONE); + applyStyle(context, attrs, defStyleAttr, defStyleRes); + } + + public void applyStyle(int resId){ + applyStyle(getContext(), null, 0, resId); + } + + private void applyStyle(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ + CharSequence text = mInputView == null ? null : mInputView.getText(); + CharSequence supportHelper = getHelper(); + CharSequence supportError = getError(); + removeAllViews(); + + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.EditText, defStyleAttr, defStyleRes); + + mLabelEnable = a.getBoolean(R.styleable.EditText_et_labelEnable, false); + mSupportMode = a.getInteger(R.styleable.EditText_et_supportMode, SUPPORT_MODE_NONE); mAutoCompleteMode = a.getInteger(R.styleable.EditText_et_autoCompleteMode, AUTOCOMPLETE_MODE_NONE); switch (mAutoCompleteMode){ @@ -133,150 +146,152 @@ private void init(Context context, AttributeSet attrs, int defStyleAttr, int def break; } - int inputId = a.getResourceId(R.styleable.EditText_et_inputId, 0); - mInputView.setId(inputId != 0 ? inputId : ViewUtil.generateViewId()); - mInputView.setFocusableInTouchMode(true); - mDividerColors = a.getColorStateList(R.styleable.EditText_et_dividerColor); - mDividerErrorColors = a.getColorStateList(R.styleable.EditText_et_dividerErrorColor); - if(mDividerColors == null){ - int[][] states = new int[][]{ - new int[]{-android.R.attr.state_focused}, - new int[]{android.R.attr.state_focused, android.R.attr.state_enabled}, - }; - int[] colors = new int[]{ - ThemeUtil.colorControlNormal(context, 0xFF000000), - ThemeUtil.colorControlActivated(context, 0xFF000000), - }; - - mDividerColors = new ColorStateList(states, colors); - } - - if(mDividerErrorColors == null) - mDividerErrorColors = ColorStateList.valueOf(ThemeUtil.colorAccent(context, 0xFFFF0000)); - - int dividerHeight = a.getDimensionPixelOffset(R.styleable.EditText_et_dividerHeight, 0); - int dividerPadding = a.getDimensionPixelOffset(R.styleable.EditText_et_dividerPadding, 0); - int dividerAnimDuration = a.getInteger(R.styleable.EditText_et_dividerAnimDuration, context.getResources().getInteger(android.R.integer.config_shortAnimTime)); + int inputId = a.getResourceId(R.styleable.EditText_et_inputId, 0); + mInputView.setId(inputId != 0 ? inputId : ViewUtil.generateViewId()); + mInputView.setFocusableInTouchMode(true); + mDividerColors = a.getColorStateList(R.styleable.EditText_et_dividerColor); + mDividerErrorColors = a.getColorStateList(R.styleable.EditText_et_dividerErrorColor); + if(mDividerColors == null){ + int[][] states = new int[][]{ + new int[]{-android.R.attr.state_focused}, + new int[]{android.R.attr.state_focused, android.R.attr.state_enabled}, + }; + int[] colors = new int[]{ + ThemeUtil.colorControlNormal(context, 0xFF000000), + ThemeUtil.colorControlActivated(context, 0xFF000000), + }; + + mDividerColors = new ColorStateList(states, colors); + } + + if(mDividerErrorColors == null) + mDividerErrorColors = ColorStateList.valueOf(ThemeUtil.colorAccent(context, 0xFFFF0000)); + + int dividerHeight = a.getDimensionPixelOffset(R.styleable.EditText_et_dividerHeight, 0); + int dividerPadding = a.getDimensionPixelOffset(R.styleable.EditText_et_dividerPadding, 0); + int dividerAnimDuration = a.getInteger(R.styleable.EditText_et_dividerAnimDuration, context.getResources().getInteger(android.R.integer.config_shortAnimTime)); mDividerCompoundPadding = a.getBoolean(R.styleable.EditText_et_dividerCompoundPadding, true); mInputView.setPadding(0, 0, 0, dividerPadding + dividerHeight); - mDivider = new DividerDrawable(dividerHeight, mDividerCompoundPadding ? mInputView.getTotalPaddingLeft() : 0, mDividerCompoundPadding ? mInputView.getTotalPaddingRight() : 0, mDividerColors, dividerAnimDuration); - mDivider.setInEditMode(isInEditMode()); - mDivider.setAnimEnable(false); - if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) - mInputView.setBackground(mDivider); - else - mInputView.setBackgroundDrawable(mDivider); - mDivider.setAnimEnable(true); + mDivider = new DividerDrawable(dividerHeight, mDividerCompoundPadding ? mInputView.getTotalPaddingLeft() : 0, mDividerCompoundPadding ? mInputView.getTotalPaddingRight() : 0, mDividerColors, dividerAnimDuration); + mDivider.setInEditMode(isInEditMode()); + mDivider.setAnimEnable(false); + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) + mInputView.setBackground(mDivider); + else + mInputView.setBackgroundDrawable(mDivider); + mDivider.setAnimEnable(true); + if(text != null) + mInputView.setText(text); mInputView.addTextChangedListener(new InputTextWatcher()); - addView(mInputView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); - - if(mLabelEnable){ - mLabelView = new LabelView(context); - mLabelView.setGravity(GravityCompat.START); - mLabelView.setSingleLine(true); - int labelPadding = a.getDimensionPixelOffset(R.styleable.EditText_et_labelPadding, 0); - int labelTextSize = a.getDimensionPixelSize(R.styleable.EditText_et_labelTextSize, 0); - ColorStateList labelTextColor = a.getColorStateList(R.styleable.EditText_et_labelTextColor); - int labelTextAppearance = a.getResourceId(R.styleable.EditText_et_labelTextAppearance, 0); - int labelEllipsize = a.getInteger(R.styleable.EditText_et_labelEllipsize, 0); - mLabelInAnimId = a.getResourceId(R.styleable.EditText_et_labelInAnim, 0); - mLabelOutAnimId = a.getResourceId(R.styleable.EditText_et_labelOutAnim, 0); + addView(mInputView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + + if(mLabelEnable){ + mLabelView = new LabelView(context); + mLabelView.setGravity(GravityCompat.START); + mLabelView.setSingleLine(true); + int labelPadding = a.getDimensionPixelOffset(R.styleable.EditText_et_labelPadding, 0); + int labelTextSize = a.getDimensionPixelSize(R.styleable.EditText_et_labelTextSize, 0); + ColorStateList labelTextColor = a.getColorStateList(R.styleable.EditText_et_labelTextColor); + int labelTextAppearance = a.getResourceId(R.styleable.EditText_et_labelTextAppearance, 0); + int labelEllipsize = a.getInteger(R.styleable.EditText_et_labelEllipsize, 0); + mLabelInAnimId = a.getResourceId(R.styleable.EditText_et_labelInAnim, 0); + mLabelOutAnimId = a.getResourceId(R.styleable.EditText_et_labelOutAnim, 0); mLabelView.setPadding(mDivider.getPaddingLeft(), 0, mDivider.getPaddingRight(), labelPadding); if(labelTextAppearance > 0) mLabelView.setTextAppearance(context, labelTextAppearance); - if(labelTextSize > 0) - mLabelView.setTextSize(TypedValue.COMPLEX_UNIT_PX, labelTextSize); + if(labelTextSize > 0) + mLabelView.setTextSize(TypedValue.COMPLEX_UNIT_PX, labelTextSize); if(labelTextColor != null) - mLabelView.setTextColor(labelTextColor); - - switch (labelEllipsize) { - case 1: - mLabelView.setEllipsize(TruncateAt.START); - break; - case 2: - mLabelView.setEllipsize(TruncateAt.MIDDLE); - break; - case 3: - mLabelView.setEllipsize(TruncateAt.END); - break; - case 4: - mLabelView.setEllipsize(TruncateAt.MARQUEE); - break; - default: - mLabelView.setEllipsize(TruncateAt.END); - break; - } - addView(mLabelView, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); - } - - if(mSupportMode != SUPPORT_MODE_NONE){ - mSupportView = new LabelView(context); - int supportPadding = a.getDimensionPixelOffset(R.styleable.EditText_et_supportPadding, 0); - int supportTextSize = a.getDimensionPixelSize(R.styleable.EditText_et_supportTextSize, 0); - mSupportColors = a.getColorStateList(R.styleable.EditText_et_supportTextColor); - mSupportErrorColors = a.getColorStateList(R.styleable.EditText_et_supportTextErrorColor); - int supportTextAppearance = a.getResourceId(R.styleable.EditText_et_supportTextAppearance, 0); - int supportEllipsize = a.getInteger(R.styleable.EditText_et_supportEllipsize, 0); - int supportMaxLines = a.getInteger(R.styleable.EditText_et_supportMaxLines, 0); - int supportLines = a.getInteger(R.styleable.EditText_et_supportLines, 0); - boolean supportSingleLine = a.getBoolean(R.styleable.EditText_et_supportSingleLine, false); - - mSupportView.setPadding(mDivider.getPaddingLeft(), supportPadding, mDivider.getPaddingRight(), 0); - mSupportView.setTextSize(TypedValue.COMPLEX_UNIT_PX, supportTextSize); - mSupportView.setTextColor(mSupportColors); - if(supportTextAppearance > 0) - mSupportView.setTextAppearance(context, supportTextAppearance); - mSupportView.setSingleLine(supportSingleLine); - if(supportMaxLines > 0) - mSupportView.setMaxLines(supportMaxLines); - if(supportLines > 0) - mSupportView.setLines(supportLines); - - switch (supportEllipsize) { - case 1: - mSupportView.setEllipsize(TruncateAt.START); - break; - case 2: - mSupportView.setEllipsize(TruncateAt.MIDDLE); - break; - case 3: - mSupportView.setEllipsize(TruncateAt.END); - break; - case 4: - mSupportView.setEllipsize(TruncateAt.MARQUEE); - break; - default: - mSupportView.setEllipsize(TruncateAt.END); - break; - } - - switch (mSupportMode) { - case SUPPORT_MODE_CHAR_COUNTER: - mSupportMaxChars = a.getInteger(R.styleable.EditText_et_supportMaxChars, 0); - mSupportView.setGravity(GravityCompat.END); - updateCharCounter(mInputView.getText().length()); - break; - case SUPPORT_MODE_HELPER: - case SUPPORT_MODE_HELPER_WITH_ERROR: - mSupportView.setGravity(GravityCompat.START); - mSupportHelper = a.getString(R.styleable.EditText_et_helper); - setError(a.getString(R.styleable.EditText_et_error)); - break; - } - addView(mSupportView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); - } - - a.recycle(); - - if(mLabelEnable){ - mLabelView.setText(mInputView.getHint()); - mLabelView.setVisibility(TextUtils.isEmpty(mInputView.getText().toString()) ? View.INVISIBLE : View.VISIBLE); - } - } - + mLabelView.setTextColor(labelTextColor); + + switch (labelEllipsize) { + case 1: + mLabelView.setEllipsize(TruncateAt.START); + break; + case 2: + mLabelView.setEllipsize(TruncateAt.MIDDLE); + break; + case 3: + mLabelView.setEllipsize(TruncateAt.END); + break; + case 4: + mLabelView.setEllipsize(TruncateAt.MARQUEE); + break; + default: + mLabelView.setEllipsize(TruncateAt.END); + break; + } + addView(mLabelView, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + } + + if(mSupportMode != SUPPORT_MODE_NONE){ + mSupportView = new LabelView(context); + int supportPadding = a.getDimensionPixelOffset(R.styleable.EditText_et_supportPadding, 0); + int supportTextSize = a.getDimensionPixelSize(R.styleable.EditText_et_supportTextSize, 0); + mSupportColors = a.getColorStateList(R.styleable.EditText_et_supportTextColor); + mSupportErrorColors = a.getColorStateList(R.styleable.EditText_et_supportTextErrorColor); + int supportTextAppearance = a.getResourceId(R.styleable.EditText_et_supportTextAppearance, 0); + int supportEllipsize = a.getInteger(R.styleable.EditText_et_supportEllipsize, 0); + int supportMaxLines = a.getInteger(R.styleable.EditText_et_supportMaxLines, 0); + int supportLines = a.getInteger(R.styleable.EditText_et_supportLines, 0); + boolean supportSingleLine = a.getBoolean(R.styleable.EditText_et_supportSingleLine, false); + + mSupportView.setPadding(mDivider.getPaddingLeft(), supportPadding, mDivider.getPaddingRight(), 0); + mSupportView.setTextSize(TypedValue.COMPLEX_UNIT_PX, supportTextSize); + mSupportView.setTextColor(mSupportColors); + if(supportTextAppearance > 0) + mSupportView.setTextAppearance(context, supportTextAppearance); + mSupportView.setSingleLine(supportSingleLine); + if(supportMaxLines > 0) + mSupportView.setMaxLines(supportMaxLines); + if(supportLines > 0) + mSupportView.setLines(supportLines); + + switch (supportEllipsize) { + case 1: + mSupportView.setEllipsize(TruncateAt.START); + break; + case 2: + mSupportView.setEllipsize(TruncateAt.MIDDLE); + break; + case 3: + mSupportView.setEllipsize(TruncateAt.END); + break; + case 4: + mSupportView.setEllipsize(TruncateAt.MARQUEE); + break; + default: + mSupportView.setEllipsize(TruncateAt.END); + break; + } + + switch (mSupportMode) { + case SUPPORT_MODE_CHAR_COUNTER: + mSupportMaxChars = a.getInteger(R.styleable.EditText_et_supportMaxChars, 0); + mSupportView.setGravity(GravityCompat.END); + updateCharCounter(mInputView.getText().length()); + break; + case SUPPORT_MODE_HELPER: + case SUPPORT_MODE_HELPER_WITH_ERROR: + mSupportView.setGravity(GravityCompat.START); + mSupportHelper = ThemeUtil.getString(a, R.styleable.EditText_et_helper, supportHelper); + setError(ThemeUtil.getString(a, R.styleable.EditText_et_error, supportError)); + break; + } + addView(mSupportView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + } + + a.recycle(); + + if(mLabelEnable){ + mLabelView.setText(mInputView.getHint()); + mLabelView.setVisibility(TextUtils.isEmpty(mInputView.getText().toString()) ? View.INVISIBLE : View.VISIBLE); + } + } + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthMode = MeasureSpec.getMode(widthMeasureSpec); diff --git a/lib/src/main/java/com/rey/material/widget/ImageButton.java b/lib/src/main/java/com/rey/material/widget/ImageButton.java index 2bb8d6c7..3b55644e 100644 --- a/lib/src/main/java/com/rey/material/widget/ImageButton.java +++ b/lib/src/main/java/com/rey/material/widget/ImageButton.java @@ -33,9 +33,17 @@ public ImageButton(Context context, AttributeSet attrs, int defStyleAttr, int de init(context, attrs, defStyleAttr, defStyleRes); } - private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ - mRippleManager.onCreate(this, context, attrs, defStyleAttr, defStyleRes); - } + private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ + applyStyle(context, attrs, defStyleAttr, defStyleRes); + } + + public void applyStyle(int resId){ + applyStyle(getContext(), null, 0, resId); + } + + private void applyStyle(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ + mRippleManager.onCreate(this, context, attrs, defStyleAttr, defStyleRes); + } @Override public void setOnClickListener(OnClickListener l) { diff --git a/lib/src/main/java/com/rey/material/widget/ProgressView.java b/lib/src/main/java/com/rey/material/widget/ProgressView.java index 496e4c25..311fe1bf 100644 --- a/lib/src/main/java/com/rey/material/widget/ProgressView.java +++ b/lib/src/main/java/com/rey/material/widget/ProgressView.java @@ -44,25 +44,37 @@ public ProgressView(Context context, AttributeSet attrs, int defStyleAttr){ public ProgressView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr); - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ProgressView, defStyleAttr, defStyleRes); - mAutostart = a.getBoolean(R.styleable.ProgressView_pv_autostart, true); - mCircular = a.getBoolean(R.styleable.ProgressView_pv_circular, true); - mProgressId = a.getResourceId(R.styleable.ProgressView_pv_progressStyle, 0); - - a.recycle(); - - if(mProgressId > 0){ - if(mCircular) - mProgressDrawable = new CircularProgressDrawable.Builder(context, mProgressId).build(); - else - mProgressDrawable = new LinearProgressDrawable.Builder(context, mProgressId).build(); - - if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) - setBackground(mProgressDrawable); - else - setBackgroundDrawable(mProgressDrawable); - } + init(context, attrs, defStyleAttr, defStyleRes); } + + private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ + applyStyle(context, attrs, defStyleAttr, defStyleRes); + } + + public void applyStyle(int resId){ + applyStyle(getContext(), null, 0, resId); + } + + private void applyStyle(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ProgressView, defStyleAttr, defStyleRes); + mAutostart = a.getBoolean(R.styleable.ProgressView_pv_autostart, true); + mCircular = a.getBoolean(R.styleable.ProgressView_pv_circular, true); + mProgressId = a.getResourceId(R.styleable.ProgressView_pv_progressStyle, 0); + + a.recycle(); + + if(mProgressId > 0){ + if(mCircular) + mProgressDrawable = new CircularProgressDrawable.Builder(context, mProgressId).build(); + else + mProgressDrawable = new LinearProgressDrawable.Builder(context, mProgressId).build(); + + if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) + setBackground(mProgressDrawable); + else + setBackgroundDrawable(mProgressDrawable); + } + } @Override public void setVisibility(int v) { diff --git a/lib/src/main/java/com/rey/material/widget/RadioButton.java b/lib/src/main/java/com/rey/material/widget/RadioButton.java index 15bee83e..edd927d3 100644 --- a/lib/src/main/java/com/rey/material/widget/RadioButton.java +++ b/lib/src/main/java/com/rey/material/widget/RadioButton.java @@ -33,8 +33,16 @@ public RadioButton(Context context, AttributeSet attrs, int defStyleAttr, int de } private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ - RadioButtonDrawable drawable = new RadioButtonDrawable.Builder(context, attrs, defStyleAttr, defStyleRes).build(); - drawable.setInEditMode(isInEditMode()); + applyStyle(context, attrs, defStyleAttr, defStyleRes); + } + + public void applyStyle(int resId){ + applyStyle(getContext(), null, 0, resId); + } + + private void applyStyle(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ + RadioButtonDrawable drawable = new RadioButtonDrawable.Builder(context, attrs, defStyleAttr, defStyleRes).build(); + drawable.setInEditMode(isInEditMode()); drawable.setAnimEnable(false); setButtonDrawable(drawable); drawable.setAnimEnable(true); diff --git a/lib/src/main/java/com/rey/material/widget/SnackBar.java b/lib/src/main/java/com/rey/material/widget/SnackBar.java index 93e65544..35800c0c 100644 --- a/lib/src/main/java/com/rey/material/widget/SnackBar.java +++ b/lib/src/main/java/com/rey/material/widget/SnackBar.java @@ -135,7 +135,7 @@ public void onClick(View v) { setClickable(true); - applyStyle(attrs, defStyleAttr, defStyleRes); + applyStyle(context, attrs, defStyleAttr, defStyleRes); } @Override @@ -203,8 +203,7 @@ protected void onLayout(boolean changed, int l, int t, int r, int b) { @SuppressWarnings("deprecation") @TargetApi(Build.VERSION_CODES.JELLY_BEAN) - private void applyStyle(AttributeSet attrs, int defStyleAttr, int defStyleRes){ - Context context = getContext(); + private void applyStyle(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SnackBar, defStyleAttr, defStyleRes); int backgroundColor = a.getColor(R.styleable.SnackBar_sb_backgroundColor, 0xFF323232); @@ -312,7 +311,7 @@ private void applyStyle(AttributeSet attrs, int defStyleAttr, int defStyleRes){ } public SnackBar applyStyle(int resId){ - applyStyle(null, 0, resId); + applyStyle(getContext(), null, 0, resId); return this; } diff --git a/lib/src/main/java/com/rey/material/widget/Spinner.java b/lib/src/main/java/com/rey/material/widget/Spinner.java index 86dc4486..3504fd49 100644 --- a/lib/src/main/java/com/rey/material/widget/Spinner.java +++ b/lib/src/main/java/com/rey/material/widget/Spinner.java @@ -123,9 +123,34 @@ public Spinner(Context context, AttributeSet attrs, int defStyleAttr, int defSty public void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { setWillNotDraw(false); - mRippleManager.onCreate(this, context, attrs, defStyleAttr, defStyleRes); - TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs, R.styleable.Spinner, defStyleAttr, defStyleRes); + applyStyle(context, attrs, defStyleAttr, defStyleRes); + + if(isInEditMode()){ + TextView tv = new TextView(context, attrs, defStyleAttr); + tv.setText("Item 1"); + super.addView(tv); + } + + setOnClickListener(new View.OnClickListener(){ + @Override + public void onClick(View v) { + showPopup(); + } + }); + } + + public void applyStyle(int resId){ + applyStyle(getContext(), null, 0, resId); + } + + private void applyStyle(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ + CharSequence memoLabel = mLabelView == null ? null : mLabelView.getText(); + + removeAllViews(); + mRippleManager.onCreate(this, context, attrs, defStyleAttr, defStyleRes); + + TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs, R.styleable.Spinner, defStyleAttr, defStyleRes); mLabelEnable = a.getBoolean(R.styleable.Spinner_spn_labelEnable, false); if(mLabelEnable){ @@ -137,7 +162,7 @@ public void init(Context context, AttributeSet attrs, int defStyleAttr, int defS ColorStateList labelTextColor = a.getColorStateList(R.styleable.Spinner_spn_labelTextColor); int labelTextAppearance = a.getResourceId(R.styleable.Spinner_spn_labelTextAppearance, 0); int labelEllipsize = a.getInteger(R.styleable.Spinner_spn_labelEllipsize, 0); - String label = a.getString(R.styleable.Spinner_spn_label); + CharSequence label = ThemeUtil.getString(a, R.styleable.Spinner_spn_label, memoLabel); mLabelView.setText(label); mLabelView.setPadding(0, 0, 0, labelPadding); @@ -168,18 +193,18 @@ public void init(Context context, AttributeSet attrs, int defStyleAttr, int defS addView(mLabelView, 0, new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); } - mGravity = a.getInt(R.styleable.Spinner_android_gravity, Gravity.CENTER); + mGravity = a.getInt(R.styleable.Spinner_android_gravity, Gravity.CENTER); setMinimumWidth(a.getDimensionPixelOffset(R.styleable.Spinner_android_minWidth, 0)); setMinimumHeight(a.getDimensionPixelOffset(R.styleable.Spinner_android_minHeight, 0)); - mPopup = new DropdownPopup(context, attrs, defStyleAttr, defStyleRes); - mPopup.setModal(true); - mDropDownWidth = a.getLayoutDimension(R.styleable.Spinner_android_dropDownWidth, LayoutParams.WRAP_CONTENT); - mPopup.setBackgroundDrawable(a.getDrawable(R.styleable.Spinner_android_popupBackground)); - mPopup.setPromptText(a.getString(R.styleable.Spinner_prompt)); - mPopup.setItemAnimation(a.getResourceId(R.styleable.Spinner_spn_popupItemAnimation, 0)); - mPopup.setItemAnimationOffset(a.getInteger(R.styleable.Spinner_spn_popupItemAnimOffset, 50)); + mPopup = new DropdownPopup(context, attrs, defStyleAttr, defStyleRes); + mPopup.setModal(true); + mDropDownWidth = a.getLayoutDimension(R.styleable.Spinner_android_dropDownWidth, LayoutParams.WRAP_CONTENT); + mPopup.setBackgroundDrawable(a.getDrawable(R.styleable.Spinner_android_popupBackground)); + mPopup.setPromptText(a.getString(R.styleable.Spinner_prompt)); + mPopup.setItemAnimation(a.getResourceId(R.styleable.Spinner_spn_popupItemAnimation, 0)); + mPopup.setItemAnimationOffset(a.getInteger(R.styleable.Spinner_spn_popupItemAnimOffset, 50)); mDisableChildrenWhenDisabled = a.getBoolean(R.styleable.Spinner_disableChildrenWhenDisabled, false); mArrowAnimSwitchMode = a.getBoolean(R.styleable.Spinner_spn_arrowSwitchMode, false); @@ -188,14 +213,14 @@ public void init(Context context, AttributeSet attrs, int defStyleAttr, int defS mArrowPadding = a.getDimensionPixelSize(R.styleable.Spinner_spn_arrowPadding, ThemeUtil.dpToPx(getContext(), 4)); ColorStateList arrowColor = a.getColorStateList(R.styleable.Spinner_spn_arrowColor); if(arrowColor == null) - arrowColor = ColorStateList.valueOf(ThemeUtil.colorControlNormal(context, 0xFF000000)); + arrowColor = ColorStateList.valueOf(ThemeUtil.colorControlNormal(context, 0xFF000000)); int resId = a.getResourceId(R.styleable.Spinner_spn_arrowInterpolator, 0); Interpolator arrowInterpolator = resId != 0 ? AnimationUtils.loadInterpolator(context, resId) : null; - boolean arrowClockwise = a.getBoolean(R.styleable.Spinner_spn_arrowAnimClockwise, true); - + boolean arrowClockwise = a.getBoolean(R.styleable.Spinner_spn_arrowAnimClockwise, true); + mArrowDrawable = new ArrowDrawable(ArrowDrawable.MODE_DOWN, mArrowSize, arrowColor, arrowAnimDuration, arrowInterpolator, arrowClockwise); mArrowDrawable.setCallback(this); - + mDividerHeight = a.getDimensionPixelOffset(R.styleable.Spinner_spn_dividerHeight, 0); mDividerPadding = a.getDimensionPixelOffset(R.styleable.Spinner_spn_dividerPadding, 0); int dividerAnimDuration = a.getInteger(R.styleable.Spinner_spn_dividerAnimDuration, 0); @@ -212,35 +237,25 @@ public void init(Context context, AttributeSet attrs, int defStyleAttr, int defS dividerColor = new ColorStateList(states, colors); } - + if(mDividerHeight > 0){ - mDividerDrawable = new DividerDrawable(mDividerHeight, dividerColor, dividerAnimDuration); - mDividerDrawable.setCallback(this); + mDividerDrawable = new DividerDrawable(mDividerHeight, dividerColor, dividerAnimDuration); + mDividerDrawable.setCallback(this); } - + mTintManager = a.getTintManager(); - - a.recycle(); - - if (mTempAdapter != null) { + + a.recycle(); + + if (mTempAdapter != null) { mPopup.setAdapter(mTempAdapter); mTempAdapter = null; } - - if(isInEditMode()){ - TextView tv = new TextView(context, attrs, defStyleAttr); - tv.setText("Item 1"); - super.addView(tv); - } - - setOnClickListener(new View.OnClickListener(){ - @Override - public void onClick(View v) { - showPopup(); - } - }); - } - + + if(mAdapter != null) + setAdapter(mAdapter); + } + public View getSelectedView() { View v = getChildAt(getChildCount() - 1); return v == mLabelView ? null : v; diff --git a/lib/src/main/java/com/rey/material/widget/Switch.java b/lib/src/main/java/com/rey/material/widget/Switch.java index 4e437111..0d7240d4 100644 --- a/lib/src/main/java/com/rey/material/widget/Switch.java +++ b/lib/src/main/java/com/rey/material/widget/Switch.java @@ -106,6 +106,10 @@ private void init(Context context, AttributeSet attrs, int defStyleAttr, int def applyStyle(context, attrs, defStyleAttr, defStyleRes); } + public void applyStyle(int resId){ + applyStyle(getContext(), null, 0, resId); + } + private void applyStyle(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ mRippleManager.onCreate(this, context, attrs, defStyleAttr, defStyleRes); diff --git a/lib/src/main/java/com/rey/material/widget/TabPageIndicator.java b/lib/src/main/java/com/rey/material/widget/TabPageIndicator.java index b0d55159..87e8cf06 100644 --- a/lib/src/main/java/com/rey/material/widget/TabPageIndicator.java +++ b/lib/src/main/java/com/rey/material/widget/TabPageIndicator.java @@ -89,39 +89,49 @@ public TabPageIndicator(Context context, AttributeSet attrs, int defStyleAttr, i private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ setHorizontalScrollBarEnabled(false); - - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TabPageIndicator, defStyleAttr, defStyleRes); - int indicatorColor; - - mTabPadding = a.getDimensionPixelSize(R.styleable.TabPageIndicator_tpi_tabPadding, ThemeUtil.dpToPx(context, 12)); - mTabRippleStyle = a.getResourceId(R.styleable.TabPageIndicator_tpi_tabRipple, 0); - indicatorColor = a.getColor(R.styleable.TabPageIndicator_tpi_indicatorColor, ThemeUtil.colorAccent(context, 0xFFFFFFFF)); - mIndicatorHeight = a.getDimensionPixelSize(R.styleable.TabPageIndicator_tpi_indicatorHeight, ThemeUtil.dpToPx(context, 2)); - mTextApperance = a.getResourceId(R.styleable.TabPageIndicator_android_textAppearance, 0); - mMode = a.getInteger(R.styleable.TabPageIndicator_tpi_mode, MODE_SCROLL); - - a.recycle(); - - mTabContainer = new LinearLayout(context); - mTabContainer.setOrientation(LinearLayout.HORIZONTAL); - mTabContainer.setGravity(Gravity.CENTER); - - if(mMode == MODE_SCROLL) - addView(mTabContainer, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)); - else if(mMode == MODE_FIXED){ - addView(mTabContainer, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); - setFillViewport(true); - } - - mPaint = new Paint(); - mPaint.setAntiAlias(true); - mPaint.setColor(indicatorColor); - mPaint.setStyle(Paint.Style.FILL); + + mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mPaint.setStyle(Paint.Style.FILL); + + mTabContainer = new LinearLayout(context); + mTabContainer.setOrientation(LinearLayout.HORIZONTAL); + mTabContainer.setGravity(Gravity.CENTER); + + applyStyle(context, attrs, defStyleAttr, defStyleRes); if(isInEditMode()) addTemporaryTab(); } + public void applyStyle(int resId){ + applyStyle(getContext(), null, 0, resId); + } + + private void applyStyle(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TabPageIndicator, defStyleAttr, defStyleRes); + + mTabPadding = a.getDimensionPixelSize(R.styleable.TabPageIndicator_tpi_tabPadding, ThemeUtil.dpToPx(context, 12)); + mTabRippleStyle = a.getResourceId(R.styleable.TabPageIndicator_tpi_tabRipple, 0); + int indicatorColor = a.getColor(R.styleable.TabPageIndicator_tpi_indicatorColor, ThemeUtil.colorAccent(context, 0xFFFFFFFF)); + mIndicatorHeight = a.getDimensionPixelSize(R.styleable.TabPageIndicator_tpi_indicatorHeight, ThemeUtil.dpToPx(context, 2)); + mTextApperance = a.getResourceId(R.styleable.TabPageIndicator_android_textAppearance, 0); + mMode = a.getInteger(R.styleable.TabPageIndicator_tpi_mode, MODE_SCROLL); + + a.recycle(); + + removeAllViews(); + if(mMode == MODE_SCROLL) { + addView(mTabContainer, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)); + setFillViewport(false); + } + else if(mMode == MODE_FIXED){ + addView(mTabContainer, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); + setFillViewport(true); + } + + mPaint.setColor(indicatorColor); + } + @Override public void onAttachedToWindow() { super.onAttachedToWindow(); diff --git a/lib/src/main/java/com/rey/material/widget/TextView.java b/lib/src/main/java/com/rey/material/widget/TextView.java index 10d96a09..ac1298f6 100644 --- a/lib/src/main/java/com/rey/material/widget/TextView.java +++ b/lib/src/main/java/com/rey/material/widget/TextView.java @@ -39,10 +39,18 @@ public TextView(Context context, AttributeSet attrs, int defStyleAttr, int defSt init(context, attrs, defStyleAttr, defStyleRes); } - - private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ - mRippleManager.onCreate(this, context, attrs, defStyleAttr, defStyleRes); - } + + private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ + applyStyle(context, attrs, defStyleAttr, defStyleRes); + } + + public void applyStyle(int resId){ + applyStyle(getContext(), null, 0, resId); + } + + private void applyStyle(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ + mRippleManager.onCreate(this, context, attrs, defStyleAttr, defStyleRes); + } @Override public void setOnClickListener(OnClickListener l) {