Skip to content

Commit 0bdc633

Browse files
committed
notification badge support
1 parent 9f098cb commit 0bdc633

7 files changed

Lines changed: 95 additions & 23 deletions

File tree

library/src/main/java/com/akiniyalocts/minor/MinorView.java

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@
99
import android.view.Gravity;
1010
import android.view.View;
1111
import android.view.ViewGroup;
12+
import android.widget.FrameLayout;
1213
import android.widget.LinearLayout;
1314
import android.widget.TextView;
1415

1516
/**
1617
* Created by anthonykiniyalocts on 5/13/16.
1718
*/
18-
public class MinorView extends LinearLayout{
19+
public class MinorView extends FrameLayout{
1920

2021
public MinorView(Context context) {
2122
super(context);
@@ -59,12 +60,8 @@ private void init(Context context, AttributeSet attrs) {
5960
0, 0
6061
);
6162

62-
params = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
63-
64-
this.setLayoutParams(getLayoutParamsForIconView());
65-
this.setOrientation(VERTICAL);
66-
6763

64+
// get attributes
6865
int iconViewRes = a.getResourceId(R.styleable.MinorView_minor_icon_view, -1);
6966

7067
String title = a.getString(R.styleable.MinorView_minor_title);
@@ -74,9 +71,27 @@ private void init(Context context, AttributeSet attrs) {
7471
selectedTitleColor = a.getColor(R.styleable.MinorView_minor_title_selected_color, -1);
7572

7673

74+
75+
// Build layout
76+
LinearLayout minorLayout = new LinearLayout(getContext());
77+
78+
minorLayout.setOrientation(LinearLayout.VERTICAL);
79+
80+
81+
minorLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, 1f));
82+
83+
minorLayout.setGravity(Gravity.CENTER_HORIZONTAL);
84+
85+
minorLayout.setPadding(5, 5, 5, 5);
86+
87+
88+
this.setClickable(true);
89+
90+
91+
// Add icon and title
7792
if(iconViewRes != -1){
7893
View iconView = inflate(context, iconViewRes, null);
79-
this.addView(iconView, getLayoutParamsForIconView());
94+
minorLayout.addView(iconView, getLayoutParamsForIconView());
8095
}
8196
else {
8297
throw new IllegalArgumentException("You must specify a view for MinorView to inflate as an icon. Use app:minor_icon_view=@layout/your_view");
@@ -87,6 +102,7 @@ private void init(Context context, AttributeSet attrs) {
87102

88103
titleTextView.setLayoutParams(getLayoutParamsForIconView());
89104
titleTextView.setText(title);
105+
titleTextView.setClickable(false);
90106

91107
titleTextView.setTextColor(titleColor);
92108

@@ -96,25 +112,24 @@ private void init(Context context, AttributeSet attrs) {
96112
}
97113
}
98114

99-
this.addView(titleTextView);
115+
titleTextView.setGravity(Gravity.CENTER_HORIZONTAL);
116+
minorLayout.addView(titleTextView);
100117
}
101118

102119

103120

104-
this.setGravity(Gravity.CENTER_HORIZONTAL);
105-
106-
this.setPadding(10, 10, 10, 10);
107-
108-
this.requestLayout();
121+
minorLayout.requestLayout();
109122

123+
this.addView(minorLayout);
110124

111125
a.recycle();
112126

113127
}
114128

129+
115130
private LayoutParams getLayoutParamsForIconView(){
116131
if(params == null) {
117-
params = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1f);
132+
params = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
118133
}
119134
return params;
120135
}
@@ -129,6 +144,22 @@ public void selected(){
129144
}
130145
}
131146

147+
public void addNotifcation(int notificationCount){
148+
FrameLayout notificationView = (FrameLayout) inflate(getContext(), R.layout.minor_notification, null);
149+
150+
TextView notificationTextView = (TextView) notificationView.findViewById(R.id.minor_notification_text);
151+
152+
153+
notificationTextView.setText(String.valueOf(notificationCount));
154+
LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.TOP | Gravity.RIGHT);
155+
params.setMargins(20,15,5,5);
156+
notificationView.setLayoutParams(params);
157+
158+
this.addView(notificationView);
159+
160+
invalidate();
161+
}
162+
132163
public void unselected(){
133164
if(titleTextView != null){
134165
if(titleColor != -1){
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<shape xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:shape="oval">
4+
<solid
5+
android:color="@color/notification_background"/>
6+
</shape>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:layout_height="wrap_content" android:layout_width="wrap_content"
4+
android:layout_margin="10dp"
5+
android:background="@drawable/minor_notification_circle">
6+
7+
<TextView
8+
android:layout_width="16dp"
9+
android:layout_height="16dp"
10+
11+
android:text="2"
12+
android:textSize="12sp"
13+
android:layout_gravity="top|right"
14+
android:id="@+id/minor_notification_text"
15+
android:textColor="@android:color/white"
16+
android:gravity="center"
17+
/>
18+
19+
</FrameLayout>

library/src/main/res/values/colors.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,6 @@
33
<color name="colorPrimary">#3F51B5</color>
44
<color name="colorPrimaryDark">#303F9F</color>
55
<color name="colorAccent">#FF4081</color>
6+
7+
<color name="notification_background">#F63D2B</color>
68
</resources>

minorsample/src/main/java/com/akiniyalocts/minorsample/MainActivity.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.akiniyalocts.minorsample;
22

3-
import android.support.v7.app.AppCompatActivity;
43
import android.os.Bundle;
4+
import android.support.v7.app.AppCompatActivity;
55
import android.view.View;
66

77
import com.akiniyalocts.minor.MinorView;
@@ -13,9 +13,20 @@ protected void onCreate(Bundle savedInstanceState) {
1313
super.onCreate(savedInstanceState);
1414
setContentView(R.layout.activity_main);
1515

16-
MinorView home = (MinorView)findViewById(R.id.last_home);
16+
final MinorView home = (MinorView)findViewById(R.id.last_home);
1717

1818
home.setOnClickListener(new View.OnClickListener() {
19+
@Override
20+
public void onClick(View v) {
21+
home.selected();
22+
}
23+
});
24+
25+
home.addNotifcation(8);
26+
27+
final MinorView lists = (MinorView)findViewById(R.id.lists);
28+
29+
lists.setOnClickListener(new View.OnClickListener() {
1930
@Override
2031
public void onClick(View v) {
2132

minorsample/src/main/res/layout/activity_main.xml

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
<com.akiniyalocts.minor.MinorView
2424
android:layout_width="wrap_content"
2525
android:layout_height="wrap_content"
26-
app:minor_selected="true"
2726
app:minor_title_selected_color="@color/colorAccent"
2827
app:minor_title="Home"
2928
app:minor_title_text_color="@android:color/white"
@@ -32,30 +31,34 @@
3231
<com.akiniyalocts.minor.MinorView
3332
android:layout_width="wrap_content"
3433
android:layout_height="wrap_content"
35-
app:minor_title="Favorites"
34+
android:id="@+id/lists"
35+
android:background="?attr/selectableItemBackground"
36+
app:minor_title="Lists"
3637
app:minor_title_text_color="@android:color/white"
3738
app:minor_icon_view="@layout/minor_home"/>
3839

3940
<com.akiniyalocts.minor.MinorView
4041
android:layout_width="wrap_content"
4142
android:layout_height="wrap_content"
42-
app:minor_title="Lists"
43+
android:background="?attr/selectableItemBackground"
44+
app:minor_title="Saved"
4345
app:minor_title_text_color="@android:color/white"
4446
app:minor_icon_view="@layout/minor_home"/>
4547

4648
<com.akiniyalocts.minor.MinorView
4749
android:layout_width="wrap_content"
4850
android:layout_height="wrap_content"
4951
android:id="@+id/last_home"
50-
android:background="?attr/selectableItemBackgroundBorderless"
51-
app:minor_title="Friends"
52+
app:minor_title_selected_color="@color/colorAccent"
53+
android:background="?attr/selectableItemBackground"
54+
app:minor_title="Account"
5255
app:minor_title_text_color="@android:color/white"
5356
app:minor_icon_view="@layout/minor_home"/>
5457

5558
<com.akiniyalocts.minor.MinorView
5659
android:layout_width="wrap_content"
5760
android:layout_height="wrap_content"
58-
app:minor_title="Account"
61+
app:minor_title="Profile"
5962
app:minor_title_text_color="@android:color/white"
6063
app:minor_icon_view="@layout/minor_home"/>
6164

minorsample/src/test/java/com/akiniyalocts/minorsample/ExampleUnitTest.java

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

33
import org.junit.Test;
44

5-
import static org.junit.Assert.*;
5+
import static org.junit.Assert.assertEquals;
66

77
/**
88
* To work on unit tests, switch the Test Artifact in the Build Variants view.

0 commit comments

Comments
 (0)