Skip to content
This repository was archived by the owner on Sep 3, 2024. It is now read-only.

Commit beab570

Browse files
authored
app/BottomNavigationView: add tab custom button (#36)
* Revert "add scroll to BottomNavigationView" This reverts commit 6743628. * Revert: "app: set correct overflow menu padding" Signed-off-by: BlackMesa123 <[email protected]> * app/BottomNavigatiomView: add addTabCustomButton Signed-off-by: BlackMesa123 <[email protected]>
1 parent cd32a94 commit beab570

File tree

7 files changed

+136
-143
lines changed

7 files changed

+136
-143
lines changed

app/src/main/java/de/dlyt/yanndroid/oneuiexample/MainActivity.java

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import android.content.res.Configuration;
77
import android.content.res.Resources;
88
import android.graphics.Color;
9+
import android.graphics.PorterDuff;
10+
import android.graphics.drawable.Drawable;
911
import android.os.Build;
1012
import android.os.Bundle;
1113
import android.view.View;
@@ -30,6 +32,7 @@
3032
import de.dlyt.yanndroid.oneui.layout.ToolbarLayout;
3133
import de.dlyt.yanndroid.oneui.sesl.support.ViewSupport;
3234
import de.dlyt.yanndroid.oneui.sesl.utils.ReflectUtils;
35+
import de.dlyt.yanndroid.oneui.utils.CustomButtonClickListener;
3336
import de.dlyt.yanndroid.oneui.utils.ThemeColor;
3437
import de.dlyt.yanndroid.oneui.view.BottomNavigationView;
3538
import de.dlyt.yanndroid.oneui.view.PopupMenu;
@@ -153,9 +156,17 @@ public void onClick(View view) {
153156
});
154157

155158
//BottomNavigationLayout
159+
Drawable icon = getDrawable(R.drawable.ic_samsung_more);
160+
icon.setColorFilter(getResources().getColor(R.color.sesl_tablayout_text_color), PorterDuff.Mode.SRC_IN);
156161
for (String s : mTabsTitleName) {
157162
bnvLayout.addTab(bnvLayout.newTab().setText(s));
158163
}
164+
bnvLayout.addTabCustomButton(icon, new CustomButtonClickListener(bnvLayout) {
165+
@Override
166+
public void onClick(View v) {
167+
popupView(v);
168+
}
169+
});
159170

160171
bnvLayout.addOnTabSelectedListener(new BottomNavigationView.OnTabSelectedListener() {
161172
public void onTabSelected(BottomNavigationView.Tab tab) {
@@ -270,23 +281,13 @@ public void onViewModeChanged(int i) {
270281
}
271282

272283
public void standardDialog(View view) {
273-
Context context = this;
274-
275-
PopupMenu popupMenu = new PopupMenu(view);
276-
ArrayList<String> list = new ArrayList<>();
277-
for (int i = 0; i < 4; i++) list.add("Menu Item " + i);
278-
popupMenu.inflate(list);
279-
popupMenu.setOnMenuItemClickListener((parent, view1, position, id) -> {
280-
popupMenu.dismiss();
281-
new AlertDialog.Builder(context)
282-
.setTitle("Title")
283-
.setMessage("Message")
284-
.setNeutralButton("Maybe", null)
285-
.setNegativeButton("No", null)
286-
.setPositiveButton("Yes", null)
287-
.show();
288-
});
289-
popupMenu.show();
284+
new AlertDialog.Builder(this)
285+
.setTitle("Title")
286+
.setMessage("Message")
287+
.setNeutralButton("Maybe", null)
288+
.setNegativeButton("No", null)
289+
.setPositiveButton("Yes", null)
290+
.show();
290291
}
291292

292293
public void singleChoiceDialog(View view) {
@@ -338,6 +339,18 @@ public void onClick(View v) {
338339
dialog.show();
339340
}
340341

342+
private void popupView(View view) {
343+
PopupMenu popupMenu = new PopupMenu(view);
344+
ArrayList<String> list = new ArrayList<>();
345+
for (int i = 0; i < 4; i++) list.add("Menu Item " + i);
346+
popupMenu.inflate(list);
347+
popupMenu.setOnMenuItemClickListener((parent, view1, position, id) -> {
348+
popupMenu.dismiss();
349+
});
350+
// temp
351+
popupMenu.show(-120, (int) ((-bnvLayout.getHeight() * 5) * 0.88f));
352+
}
353+
341354

342355
private LinkedHashMap<String, Integer> getMoreMenuButtonList() {
343356
LinkedHashMap linkedHashMap = new LinkedHashMap();

yanndroid/oneui/src/main/java/de/dlyt/yanndroid/oneui/sesl/tabs/SamsungBaseTabLayout.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1361,6 +1361,7 @@ public interface OnTabSelectedListener extends BaseOnTabSelectedListener<Tab> {
13611361
}
13621362

13631363
public static class Tab {
1364+
public boolean isCustomButton;
13641365
public CharSequence contentDesc;
13651366
public View customView;
13661367
public Drawable icon;
@@ -1501,6 +1502,15 @@ public void updateView() {
15011502
}
15021503

15031504
}
1505+
1506+
public boolean getIsCustomButtonView() {
1507+
return isCustomButton;
1508+
}
1509+
1510+
public Tab setIsCustomButtonView(boolean z) {
1511+
isCustomButton = z;
1512+
return this;
1513+
}
15041514
}
15051515

15061516
public static class TabLayoutOnPageChangeListener implements SeslViewPager.OnPageChangeListener {
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package de.dlyt.yanndroid.oneui.utils;
2+
3+
import android.view.MotionEvent;
4+
import android.view.View;
5+
6+
import de.dlyt.yanndroid.oneui.view.BottomNavigationView;
7+
8+
public abstract class CustomButtonClickListener implements View.OnTouchListener {
9+
private BottomNavigationView mBnv;
10+
11+
public CustomButtonClickListener(BottomNavigationView bnv) {
12+
mBnv = bnv;
13+
}
14+
15+
@Override
16+
public boolean onTouch(View v, MotionEvent ev) {
17+
int action = ev.getAction();
18+
switch (action) {
19+
case MotionEvent.ACTION_DOWN:
20+
v.setPressed(true);
21+
break;
22+
case MotionEvent.ACTION_UP:
23+
v.setPressed(false);
24+
onClick(v);
25+
mBnv.fullScroll(mBnv.getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL ? View.FOCUS_LEFT : View.FOCUS_RIGHT);
26+
break;
27+
case MotionEvent.ACTION_CANCEL:
28+
v.setPressed(false);
29+
break;
30+
}
31+
return true;
32+
}
33+
34+
public abstract void onClick(View v);
35+
}

yanndroid/oneui/src/main/java/de/dlyt/yanndroid/oneui/view/BottomNavigationView.java

Lines changed: 49 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44
import android.content.Context;
55
import android.content.res.Configuration;
66
import android.graphics.Point;
7+
import android.graphics.drawable.Drawable;
78
import android.provider.Settings;
89
import android.util.AttributeSet;
910
import android.util.DisplayMetrics;
10-
import android.util.Log;
1111
import android.view.Display;
12+
import android.view.MotionEvent;
1213
import android.view.View;
1314
import android.view.ViewGroup;
1415
import android.view.Window;
@@ -23,11 +24,11 @@
2324
import de.dlyt.yanndroid.oneui.sesl.support.ViewSupport;
2425
import de.dlyt.yanndroid.oneui.sesl.support.WindowManagerSupport;
2526
import de.dlyt.yanndroid.oneui.sesl.tabs.SamsungBaseTabLayout;
27+
import de.dlyt.yanndroid.oneui.utils.CustomButtonClickListener;
2628

2729
public class BottomNavigationView extends SamsungBaseTabLayout implements View.OnSystemUiVisibilityChangeListener {
2830
private Activity mActivity;
2931
private boolean mIsResumed = false;
30-
private ArrayList<TextView> mTextViews;
3132

3233
public BottomNavigationView(Context context, AttributeSet attrs) {
3334
this(context, attrs, R.attr.bottomNaviViewStyle);
@@ -38,110 +39,68 @@ public BottomNavigationView(Context context, AttributeSet attrs, int defStyleAtt
3839
mDepthStyle = 1;
3940
}
4041

41-
public void updateWidget(Activity activity) {
42-
mActivity = activity;
43-
mTextViews = new ArrayList<>();
44-
45-
Float[] tabCount = new Float[getTabCount()];
46-
float f = 0.0f;
47-
48-
for (int tabPosition = 0; tabPosition < getTabCount(); tabPosition++) {
49-
Tab tab = getTabAt(tabPosition);
50-
ViewGroup tabView = (ViewGroup) getTabView(tabPosition);
51-
if (!(tab == null || tabView == null)) {
52-
TextView textView = tab.seslGetTextView();
53-
mTextViews.add(textView);
54-
ViewSupport.setPointerIcon(tabView, 1000);
42+
@Override
43+
public void onConfigurationChanged(Configuration newConfig) {
44+
super.onConfigurationChanged(newConfig);
45+
invalidateTabLayout();
46+
}
5547

56-
tabCount[tabPosition] = getTabTextWidth(tab.seslGetTextView());
57-
f += tabCount[tabPosition];
58-
}
48+
@Override
49+
public void onSystemUiVisibilityChange(int visibility) {
50+
if (mIsResumed) {
51+
invalidateTabLayout();
5952
}
53+
}
6054

61-
setViewDimens(tabCount, f);
62-
invalidateTabLayout();
55+
public void addTabCustomButton(Drawable icon, CustomButtonClickListener listener) {
56+
Tab tab = newTab().setIcon(icon).setIsCustomButtonView(true);
57+
addTab(tab);
58+
((ViewGroup) getTabView(tab.getPosition())).setOnTouchListener(listener);
6359
}
6460

65-
private void setViewDimens(Float[] fArr, float f) {
66-
int i;
67-
int tabCount = getTabCount();
68-
if (tabCount > 0) {
69-
int dimensionPixelSize = getResources().getDimensionPixelSize(R.dimen.tablayout_start_end_margin);
70-
i = getContext().getResources().getDisplayMetrics().widthPixels;
71-
int i2 = i - (dimensionPixelSize * 2);
72-
float dimensionPixelSize2 = (float) getResources().getDimensionPixelSize(R.dimen.tablayout_text_padding);
73-
float f2 = (float) i2;
74-
float f3 = f2 / ((float) tabCount);
75-
float f4 = dimensionPixelSize2 * 2.0f;
76-
float f5 = (0.75f * f2) - f4;
77-
float f6 = 0.0f;
78-
int i3 = 0;
79-
int i4 = 0;
80-
for (int i5 = 0; i5 < tabCount; i5++) {
81-
Log.d("BottomNavigationView", "i : " + i5 + ", width : " + fArr[i5]);
82-
if (f5 < fArr[i5].floatValue()) {
83-
i3 = (int) (((float) i3) + (fArr[i5].floatValue() - f5));
84-
fArr[i5] = Float.valueOf(f5);
85-
i4++;
86-
f6 = f5;
87-
} else if (f6 < fArr[i5].floatValue()) {
88-
f6 = fArr[i5].floatValue();
89-
}
90-
}
91-
float f7 = f - ((float) i3);
92-
setTabMode(0);
93-
Log.d("BottomNavigationView", "[MODE_SCROLLABLE]");
94-
Log.d("BottomNavigationView", "availableContentWidth : " + i2 + ", tabTextPaddingLeftRight : " + dimensionPixelSize2);
95-
ViewGroup viewGroup = (ViewGroup) getChildAt(0);
96-
int i6 = (tabCount - i4) * 2;
97-
int i7 = i6 > 0 ? ((int) ((f2 - f7) - ((((float) i4) * dimensionPixelSize2) * 2.0f))) / i6 : 0;
98-
int i8 = (int) dimensionPixelSize2;
99-
int i9 = -1;
100-
boolean z = true;
101-
if (i7 < i8) {
102-
i7 = i8;
103-
} else {
104-
float f8 = f6 + dimensionPixelSize2 + dimensionPixelSize2;
105-
if (f3 >= f8) {
106-
setTabMode(1);
107-
for (int i10 = 0; i10 < tabCount; i10++) {
108-
((ViewGroup) viewGroup.getChildAt(i10)).getChildAt(0).getLayoutParams().width = -1;
109-
getTabAt(i10).seslGetTextView().setMaxWidth(i2);
110-
getTabAt(i10).seslGetTextView().setMinimumWidth(0);
111-
getTabAt(i10).seslGetTextView().setPadding(0, 0, 0, 0);
112-
}
113-
Log.d("BottomNavigationView", "[MODE_FIXED] TabCount : " + tabCount + ", minNeededTabWidth : " + f3 + ", maxTabWidth : " + f8);
114-
return;
61+
public void setResumeStatus(boolean isResumed) {
62+
mIsResumed = isResumed;
63+
}
64+
65+
public void setTabLayoutEnabled(boolean enabled) {
66+
float f;
67+
setEnabled(enabled);
68+
for (int tabPosition = 0; tabPosition < getTabCount(); tabPosition++) {
69+
ViewGroup tabView = (ViewGroup) getTabView(tabPosition);
70+
if (tabView != null) {
71+
tabView.setEnabled(enabled);
72+
if (enabled) {
73+
f = 1.0f;
74+
} else {
75+
f = 0.4f;
11576
}
77+
tabView.setAlpha(f);
11678
}
117-
int i11 = 0;
118-
while (i11 < tabCount) {
119-
boolean z2 = fArr[i11].floatValue() >= f5 ? z : false;
120-
int floatValue = (int) (fArr[i11].floatValue() + ((z2 ? dimensionPixelSize2 : (float) i7) * 2.0f));
121-
ViewGroup.LayoutParams layoutParams = viewGroup.getChildAt(i11).getLayoutParams();
122-
layoutParams.width = floatValue;
123-
layoutParams.height = i9;
124-
viewGroup.getChildAt(i11).setMinimumWidth(floatValue);
125-
int i12 = z2 ? 0 : (int) (((float) i7) - dimensionPixelSize2);
126-
getTabAt(i11).seslGetTextView().setMaxWidth((int) f5);
127-
getTabAt(i11).seslGetTextView().setMinimumWidth(floatValue - ((int) f4));
128-
getTabAt(i11).seslGetTextView().setPadding(i12, 0, i12, 0);
129-
Log.d("BottomNavigationView", "params.width : " + layoutParams.width + ", tabWidthList[" + i11 + "] : " + fArr[i11] + ", LeftRightPadding : " + (i7 * 2));
130-
i11++;
131-
i9 = -1;
132-
z = true;
133-
}
134-
requestLayout();
13579
}
13680
}
13781

82+
public void updateWidget(Activity activity) {
83+
mActivity = activity;
84+
invalidateTabLayout();
85+
}
86+
13887
private void invalidateTabLayout() {
13988
ArrayList<Float> tabTextWidthList = new ArrayList<>();
14089
float tabTextWidthSum = 0.0f;
14190
for (int tabPosition = 0; tabPosition < getTabCount(); tabPosition++) {
142-
float width = getTabTextWidth((TextView) mTextViews.get(tabPosition));
91+
Tab tab = getTabAt(tabPosition);
92+
ViewGroup tabView = (ViewGroup) getTabView(tabPosition);
93+
float width = 0.0f;
94+
95+
if (tab.getIsCustomButtonView()) {
96+
width = tab.getIcon().getIntrinsicWidth();
97+
tabView.setBackground(getContext().getDrawable(R.drawable.bottomnavview_button_background));
98+
} else
99+
width = getTabTextWidth(tab.seslGetTextView());
100+
143101
tabTextWidthList.add(width);
144102
tabTextWidthSum += width;
103+
ViewSupport.setPointerIcon(tabView, 1000 /* PointerIcon.TYPE_ARROW */);
145104
}
146105
addTabPaddingValue(tabTextWidthList, tabTextWidthSum);
147106
}
@@ -214,40 +173,6 @@ private ViewGroup getTabViewGroup() {
214173
return (ViewGroup) view;
215174
}
216175

217-
public void setTabLayoutEnabled(boolean enabled) {
218-
float f;
219-
setEnabled(enabled);
220-
for (int tabPosition = 0; tabPosition < getTabCount(); tabPosition++) {
221-
ViewGroup tabView = (ViewGroup) getTabView(tabPosition);
222-
if (tabView != null) {
223-
tabView.setEnabled(enabled);
224-
if (enabled) {
225-
f = 1.0f;
226-
} else {
227-
f = 0.4f;
228-
}
229-
tabView.setAlpha(f);
230-
}
231-
}
232-
}
233-
234-
public void setResumeStatus(boolean isResumed) {
235-
mIsResumed = isResumed;
236-
}
237-
238-
@Override
239-
public void onSystemUiVisibilityChange(int visibility) {
240-
if (mIsResumed) {
241-
invalidateTabLayout();
242-
}
243-
}
244-
245-
@Override
246-
public void onConfigurationChanged(Configuration newConfig) {
247-
super.onConfigurationChanged(newConfig);
248-
invalidateTabLayout();
249-
}
250-
251176
private double getDensity(Context context) {
252177
Configuration configuration = context.getResources().getConfiguration();
253178
DisplayMetrics metrics = new DisplayMetrics();
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<ripple android:color="@color/sesl_ripple_color"
3+
xmlns:android="http://schemas.android.com/apk/res/android">
4+
<item android:gravity="center_vertical" android:id="@android:id/mask" android:height="43.0dip">
5+
<shape android:shape="rectangle">
6+
<solid android:color="@color/background_color" />
7+
<corners android:radius="26.0dip" />
8+
</shape>
9+
</item>
10+
</ripple>

yanndroid/oneui/src/main/res/layout/samsung_appbar_toolbarlayout.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@
8181
android:layout_height="?actionBarSize"
8282
android:layout_alignParentEnd="true"
8383
android:orientation="horizontal"
84-
android:paddingEnd="6.0dip" />
84+
android:paddingEnd="8.0dip" />
8585

8686
<View
8787
android:id="@+id/toolbar_layout_popup_window_anchor"

0 commit comments

Comments
 (0)