Skip to content

Commit b2efc52

Browse files
Piotr Zawadzkizawadz88
Piotr Zawadzki
authored andcommitted
- Added an option to set different compound drawables for navigation buttons (issue #54 & #55)
- Aligned navigation button text size and padding with design guides
1 parent fed56b7 commit b2efc52

27 files changed

+210
-61
lines changed

README.md

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -243,9 +243,10 @@ public class DelayedTransitionStepFragmentSample extends Fragment implements Blo
243243
}
244244
```
245245

246-
### Changing Back/Next button labels per step
246+
### Changing Back/Next button labels & compound drawables per step
247247
Sometimes you might want to have different labels on the Next and/or Back navigation buttons on different steps e.g. use the default labels on the first few steps,
248248
but display 'Summary' just before the last page.
249+
You might also want to use your custom icons instead of the default navigation button compound drawables or not show the compound drawables for some of the buttons.
249250
<p><img src ="./gifs/different-next-buttons.gif" width="360" height="640"/></p>
250251
In such case you need to override the `getViewModel(int)` method from the `StepAdapter` e.g.
251252
```java
@@ -257,13 +258,16 @@ In such case you need to override the `getViewModel(int)` method from the `StepA
257258
switch (position) {
258259
case 0:
259260
builder
260-
.setNextButtonLabel("This way")
261-
.setBackButtonLabel("Go to first");
261+
.setNextButtonLabel("This way")
262+
.setBackButtonLabel("Cancel")
263+
.setNextButtonEndDrawableResId(R.drawable.ms_forward_arrow)
264+
.setBackButtonStartDrawableResId(StepViewModel.NULL_DRAWABLE);
262265
break;
263266
case 1:
264267
builder
265-
.setNextButtonLabel(R.string.go_to_summary)
266-
.setBackButtonLabel("Go to first");
268+
.setNextButtonLabel(R.string.go_to_summary)
269+
.setBackButtonLabel("Go to first")
270+
.setBackButtonStartDrawableResId(R.drawable.ms_back_arrow);
267271
break;
268272
case 2:
269273
builder.setBackButtonLabel("Go back");

material-stepper/src/main/java/com/stepstone/stepper/StepperLayout.java

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -427,8 +427,27 @@ private void initNavigation() {
427427
mNextNavigationButton.setText(mNextButtonText);
428428
mCompleteNavigationButton.setText(mCompleteButtonText);
429429

430-
//FIXME: 16/03/16 this is a workaround for tinting TextView's compound drawables on API 16-17 - when set in XML only the default color is used...
431-
Drawable chevronEndDrawable = ResourcesCompat.getDrawable(getContext().getResources(), R.drawable.ic_chevron_end, null);
430+
setBackgroundIfPresent(mBackButtonBackground, mBackNavigationButton);
431+
setBackgroundIfPresent(mNextButtonBackground, mNextNavigationButton);
432+
setBackgroundIfPresent(mCompleteButtonBackground, mCompleteNavigationButton);
433+
434+
mBackNavigationButton.setOnClickListener(mOnBackClickListener);
435+
mNextNavigationButton.setOnClickListener(mOnNextClickListener);
436+
mCompleteNavigationButton.setOnClickListener(mOnCompleteClickListener);
437+
}
438+
439+
private void setCompoundDrawablesForNavigationButtons(@DrawableRes int backDrawableResId, @DrawableRes int nextDrawableResId) {
440+
Drawable chevronStartDrawable = backDrawableResId != StepViewModel.NULL_DRAWABLE
441+
? ResourcesCompat.getDrawable(getContext().getResources(), backDrawableResId, null)
442+
: null;
443+
Drawable chevronEndDrawable = nextDrawableResId != StepViewModel.NULL_DRAWABLE
444+
? ResourcesCompat.getDrawable(getContext().getResources(), nextDrawableResId, null)
445+
: null;
446+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
447+
mBackNavigationButton.setCompoundDrawablesRelativeWithIntrinsicBounds(chevronStartDrawable, null, null, null);
448+
} else {
449+
mBackNavigationButton.setCompoundDrawablesWithIntrinsicBounds(chevronStartDrawable, null, null, null);
450+
}
432451
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
433452
mNextNavigationButton.setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, chevronEndDrawable, null);
434453
} else {
@@ -438,14 +457,6 @@ private void initNavigation() {
438457
TintUtil.tintTextView(mBackNavigationButton, mBackButtonColor);
439458
TintUtil.tintTextView(mNextNavigationButton, mNextButtonColor);
440459
TintUtil.tintTextView(mCompleteNavigationButton, mCompleteButtonColor);
441-
442-
setBackgroundIfPresent(mBackButtonBackground, mBackNavigationButton);
443-
setBackgroundIfPresent(mNextButtonBackground, mNextNavigationButton);
444-
setBackgroundIfPresent(mCompleteButtonBackground, mCompleteNavigationButton);
445-
446-
mBackNavigationButton.setOnClickListener(mOnBackClickListener);
447-
mNextNavigationButton.setOnClickListener(mOnNextClickListener);
448-
mCompleteNavigationButton.setOnClickListener(mOnCompleteClickListener);
449460
}
450461

451462
private void setBackgroundIfPresent(@DrawableRes int backgroundRes, View view) {
@@ -629,12 +640,14 @@ private void onUpdate(int newStepPosition, boolean animate) {
629640

630641
final StepViewModel viewModel = mStepAdapter.getViewModel(newStepPosition);
631642

632-
updateBackButtonText(viewModel);
643+
updateBackButton(viewModel);
633644

634645
if (!isLast) {
635-
updateNextButtonText(viewModel);
646+
updateNextButton(viewModel);
636647
}
637648

649+
setCompoundDrawablesForNavigationButtons(viewModel.getBackButtonStartDrawableResId(), viewModel.getNextButtonEndDrawableResId());
650+
638651
//needs to be here in case user for any reason decide to change whether or not to show errors when going back.
639652
mStepperType.showErrorStateOnBack(mShowErrorStateOnBack);
640653
mStepperType.onStepSelected(newStepPosition);
@@ -645,7 +658,7 @@ private void onUpdate(int newStepPosition, boolean animate) {
645658
}
646659
}
647660

648-
private void updateNextButtonText(@NonNull StepViewModel viewModel) {
661+
private void updateNextButton(@NonNull StepViewModel viewModel) {
649662
CharSequence nextButtonTextForStep = viewModel.getNextButtonLabel();
650663
if (nextButtonTextForStep == null) {
651664
mNextNavigationButton.setText(mNextButtonText);
@@ -654,7 +667,7 @@ private void updateNextButtonText(@NonNull StepViewModel viewModel) {
654667
}
655668
}
656669

657-
private void updateBackButtonText(@NonNull StepViewModel viewModel) {
670+
private void updateBackButton(@NonNull StepViewModel viewModel) {
658671
CharSequence backButtonTextForStep = viewModel.getBackButtonLabel();
659672
if (backButtonTextForStep == null) {
660673
mBackNavigationButton.setText(mBackButtonText);

material-stepper/src/main/java/com/stepstone/stepper/viewmodel/StepViewModel.java

Lines changed: 84 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,34 @@
11
package com.stepstone.stepper.viewmodel;
22

33
import android.content.Context;
4+
import android.support.annotation.DrawableRes;
45
import android.support.annotation.NonNull;
56
import android.support.annotation.Nullable;
67
import android.support.annotation.StringRes;
78

9+
import com.stepstone.stepper.R;
10+
811
/**
912
* Contains view information about the step.
1013
*
1114
* @author Piotr Zawadzki
1215
*/
1316
public class StepViewModel {
1417

18+
/**
19+
* Drawable resource ID to be used for back/next navigation button compound drawables when we do not want to show them.
20+
* @see #mNextButtonEndDrawableResId
21+
* @see #mBackButtonStartDrawableResId
22+
*/
23+
public static final int NULL_DRAWABLE = -1;
24+
1525
private StepViewModel() {}
1626

1727
/**
1828
* The displayable name of the step.
1929
*/
2030
@Nullable
21-
private CharSequence title;
31+
private CharSequence mTitle;
2232

2333
/**
2434
* Allows to override the text on the Next button for this step.
@@ -29,7 +39,7 @@ private StepViewModel() {}
2939
* This is not used for the last step.
3040
*/
3141
@Nullable
32-
private CharSequence nextButtonLabel;
42+
private CharSequence mNextButtonLabel;
3343

3444
/**
3545
* Allows to override the text on the Back button for this step.
@@ -39,44 +49,74 @@ private StepViewModel() {}
3949
* By default this is {@code null}.
4050
*/
4151
@Nullable
42-
private CharSequence backButtonLabel;
52+
private CharSequence mBackButtonLabel;
53+
54+
/**
55+
* Drawable resource ID to be used for next button's end compound drawable.
56+
* {@link com.stepstone.stepper.R.drawable#ic_chevron_end} is the default.
57+
*/
58+
@DrawableRes
59+
private int mNextButtonEndDrawableResId;
60+
61+
/**
62+
* Drawable resource ID to be used for back button's start compound drawable.
63+
* {@link com.stepstone.stepper.R.drawable#ic_chevron_start} is the default.
64+
*/
65+
@DrawableRes
66+
private int mBackButtonStartDrawableResId;
4367

4468
@Nullable
4569
public CharSequence getTitle() {
46-
return title;
70+
return mTitle;
4771
}
4872

4973
@Nullable
5074
public CharSequence getNextButtonLabel() {
51-
return nextButtonLabel;
75+
return mNextButtonLabel;
5276
}
5377

5478
@Nullable
5579
public CharSequence getBackButtonLabel() {
56-
return backButtonLabel;
80+
return mBackButtonLabel;
81+
}
82+
83+
@DrawableRes
84+
public int getNextButtonEndDrawableResId() {
85+
return mNextButtonEndDrawableResId;
86+
}
87+
88+
@DrawableRes
89+
public int getBackButtonStartDrawableResId() {
90+
return mBackButtonStartDrawableResId;
5791
}
5892

5993
public static class Builder {
6094

6195
@NonNull
62-
private final Context context;
96+
private final Context mContext;
6397

6498
@Nullable
65-
private CharSequence title;
99+
private CharSequence mTitle;
66100

67101
@Nullable
68-
private CharSequence nextButtonLabel;
102+
private CharSequence mNextButtonLabel;
69103

70104
@Nullable
71-
private CharSequence backButtonLabel;
105+
private CharSequence mBackButtonLabel;
106+
107+
@DrawableRes
108+
private int mNextButtonEndDrawableResId = R.drawable.ic_chevron_end;
109+
110+
@DrawableRes
111+
private int mBackButtonStartDrawableResId = R.drawable.ic_chevron_start;
72112

73113
/**
74114
* Creates a builder for the step info.
75115
*
76116
* @param context the parent context
77117
*/
78118
public Builder(@NonNull Context context) {
79-
this.context = context;
119+
this.mContext = context;
80120
}
81121

82122
/**
@@ -86,7 +126,7 @@ public Builder(@NonNull Context context) {
86126
* @return This Builder object to allow for chaining of calls to set methods
87127
*/
88128
public Builder setTitle(@StringRes int titleId) {
89-
this.title = context.getString(titleId);
129+
this.mTitle = mContext.getString(titleId);
90130
return this;
91131
}
92132

@@ -97,7 +137,7 @@ public Builder setTitle(@StringRes int titleId) {
97137
* @return This Builder object to allow for chaining of calls to set methods
98138
*/
99139
public Builder setTitle(@Nullable CharSequence title) {
100-
this.title = title;
140+
this.mTitle = title;
101141
return this;
102142
}
103143

@@ -108,7 +148,7 @@ public Builder setTitle(@Nullable CharSequence title) {
108148
* @return This Builder object to allow for chaining of calls to set methods
109149
*/
110150
public Builder setNextButtonLabel(@StringRes int nextButtonLabelId) {
111-
this.nextButtonLabel = context.getString(nextButtonLabelId);
151+
this.mNextButtonLabel = mContext.getString(nextButtonLabelId);
112152
return this;
113153
}
114154

@@ -119,7 +159,7 @@ public Builder setNextButtonLabel(@StringRes int nextButtonLabelId) {
119159
* @return This Builder object to allow for chaining of calls to set methods
120160
*/
121161
public Builder setNextButtonLabel(@Nullable CharSequence nextButtonLabel) {
122-
this.nextButtonLabel = nextButtonLabel;
162+
this.mNextButtonLabel = nextButtonLabel;
123163
return this;
124164
}
125165

@@ -130,7 +170,7 @@ public Builder setNextButtonLabel(@Nullable CharSequence nextButtonLabel) {
130170
* @return This Builder object to allow for chaining of calls to set methods
131171
*/
132172
public Builder setBackButtonLabel(@StringRes int backButtonLabelId) {
133-
this.backButtonLabel = context.getString(backButtonLabelId);
173+
this.mBackButtonLabel = mContext.getString(backButtonLabelId);
134174
return this;
135175
}
136176

@@ -141,7 +181,29 @@ public Builder setBackButtonLabel(@StringRes int backButtonLabelId) {
141181
* @return This Builder object to allow for chaining of calls to set methods
142182
*/
143183
public Builder setBackButtonLabel(@Nullable CharSequence backButtonLabel) {
144-
this.backButtonLabel = backButtonLabel;
184+
this.mBackButtonLabel = backButtonLabel;
185+
return this;
186+
}
187+
188+
/**
189+
* Set the drawable resource ID to be used for next button's end compound drawable.
190+
*
191+
* @param nextButtonEndDrawableResId drawable resource ID to be used for next button's end compound drawable.
192+
* @return This Builder object to allow for chaining of calls to set methods
193+
*/
194+
public Builder setNextButtonEndDrawableResId(@DrawableRes int nextButtonEndDrawableResId) {
195+
this.mNextButtonEndDrawableResId = nextButtonEndDrawableResId;
196+
return this;
197+
}
198+
199+
/**
200+
* Set the drawable resource ID to be used for back button's start compound drawable.
201+
*
202+
* @param backButtonStartDrawableResId drawable resource ID to be used for back button's start compound drawable.
203+
* @return This Builder object to allow for chaining of calls to set methods
204+
*/
205+
public Builder setBackButtonStartDrawableResId(@DrawableRes int backButtonStartDrawableResId) {
206+
this.mBackButtonStartDrawableResId = backButtonStartDrawableResId;
145207
return this;
146208
}
147209

@@ -152,9 +214,11 @@ public Builder setBackButtonLabel(@Nullable CharSequence backButtonLabel) {
152214
*/
153215
public StepViewModel create() {
154216
final StepViewModel viewModel = new StepViewModel();
155-
viewModel.title = this.title;
156-
viewModel.backButtonLabel = this.backButtonLabel;
157-
viewModel.nextButtonLabel = this.nextButtonLabel;
217+
viewModel.mTitle = this.mTitle;
218+
viewModel.mBackButtonLabel = this.mBackButtonLabel;
219+
viewModel.mNextButtonLabel = this.mNextButtonLabel;
220+
viewModel.mNextButtonEndDrawableResId = this.mNextButtonEndDrawableResId;
221+
viewModel.mBackButtonStartDrawableResId = this.mBackButtonStartDrawableResId;
158222
return viewModel;
159223
}
160224

Loading
Loading
Loading
Loading

material-stepper/src/main/res/drawable-v21/ms_default_button_background.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
<item android:id="@android:id/mask">
66

7-
<inset xmlns:android="http://schemas.android.com/apk/res/android"
7+
<inset
88
android:insetBottom="@dimen/ms_nav_bar_button_margin"
99
android:insetLeft="@dimen/ms_nav_bar_button_margin"
1010
android:insetRight="@dimen/ms_nav_bar_button_margin"
Loading
Loading
Loading
Loading

material-stepper/src/main/res/drawable/ms_default_button_background.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
<item android:state_pressed="true">
55

6-
<inset xmlns:android="http://schemas.android.com/apk/res/android" android:insetBottom="@dimen/ms_nav_bar_button_margin" android:insetLeft="@dimen/ms_nav_bar_button_margin" android:insetRight="@dimen/ms_nav_bar_button_margin" android:insetTop="@dimen/ms_nav_bar_button_margin">
6+
<inset android:insetBottom="@dimen/ms_nav_bar_button_margin" android:insetLeft="@dimen/ms_nav_bar_button_margin" android:insetRight="@dimen/ms_nav_bar_button_margin" android:insetTop="@dimen/ms_nav_bar_button_margin">
77
<shape android:shape="rectangle">
88
<corners android:radius="@dimen/ms_material_button_corner_radius" />
99
<solid android:color="@color/ms_defaultButtonBackgroundColor" />
@@ -14,7 +14,7 @@
1414

1515
<item>
1616

17-
<inset xmlns:android="http://schemas.android.com/apk/res/android" android:insetBottom="@dimen/ms_nav_bar_button_margin" android:insetLeft="@dimen/ms_nav_bar_button_margin" android:insetRight="@dimen/ms_nav_bar_button_margin" android:insetTop="@dimen/ms_nav_bar_button_margin">
17+
<inset android:insetBottom="@dimen/ms_nav_bar_button_margin" android:insetLeft="@dimen/ms_nav_bar_button_margin" android:insetRight="@dimen/ms_nav_bar_button_margin" android:insetTop="@dimen/ms_nav_bar_button_margin">
1818
<shape android:shape="rectangle">
1919
<corners android:radius="@dimen/ms_material_button_corner_radius" />
2020
<solid android:color="@android:color/transparent" />

material-stepper/src/main/res/values/dimens.xml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ limitations under the License.
1919
<dimen name="ms_dotted_progress_bar_dot_size">10dp</dimen>
2020
<dimen name="ms_tabs_container_lateral_padding">24dp</dimen>
2121

22-
<dimen name="ms_nav_bar_button_padding">8dp</dimen>
22+
<dimen name="ms_nav_bar_button_padding_vertical">8dp</dimen>
23+
<dimen name="ms_nav_bar_button_padding_lateral">16dp</dimen>
2324
<dimen name="ms_nav_bar_button_margin">8dp</dimen>
2425

2526
<dimen name="ms_material_button_corner_radius">2dp</dimen>
@@ -29,7 +30,7 @@ limitations under the License.
2930
<dimen name="ms_progress_bar_width">96dp</dimen>
3031
<dimen name="ms_progress_bar_height">3dp</dimen>
3132
<dimen name="ms_error_drawable_padding">8dp</dimen>
32-
<dimen name="ms_navigation_button_text_size">16sp</dimen>
33+
<dimen name="ms_navigation_button_text_size">14sp</dimen>
3334

3435
<!-- TABS -->
3536
<dimen name="ms_step_tab_height">72dp</dimen>

0 commit comments

Comments
 (0)