Skip to content

Commit d79ad9d

Browse files
committed
#48 Modify renderer for android bottom tabs in XF 3.1
1 parent 19140e6 commit d79ad9d

23 files changed

+166
-101
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,4 @@ Thumbs.db
5757
/tools
5858
/.vscode
5959
/.build/nuget
60+
Source/.vs/Plugin.Badge/DesignTimeBuild/.dtbcache

Source/Plugin.Badge.Abstractions/Plugin.Badge.Abstractions.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<TargetFramework>netstandard1.4</TargetFramework>
44
</PropertyGroup>
55
<ItemGroup>
6-
<PackageReference Include="Xamarin.Forms" Version="2.5.0.280555" />
6+
<PackageReference Include="Xamarin.Forms" Version="3.1.0.583944" />
77
</ItemGroup>
88
<ItemGroup>
99
<Folder Include="Properties\" />

Source/Plugin.Badge.Droid/BadgeView.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ public Color BadgeColor
6464

6565
public Color TextColor
6666
{
67-
get { return new Color(CurrentTextColor); }
68-
set { SetTextColor(value); }
67+
get => new Color(CurrentTextColor);
68+
set => SetTextColor(value);
6969
}
7070

7171
public void SetMargins(float left, float top, float right, float bottom)
@@ -152,7 +152,6 @@ private void ApplyTo(View target)
152152

153153
group.SetClipChildren(false);
154154
group.SetClipToPadding(false);
155-
156155

157156
var container = new FrameLayout(_context);
158157
var index = group.IndexOfChild(target);

Source/Plugin.Badge.Droid/BadgeViewExtensions.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,7 @@ public static T FindChildOfType<T>(this ViewGroup parent) where T : View
9696
var child = parent.GetChildAt(i);
9797

9898

99-
var typedChild = child as T;
100-
if (typedChild != null)
99+
if (child is T typedChild)
101100
{
102101
return typedChild;
103102
}

Source/Plugin.Badge.Droid/BadgedTabbedPageRenderer.cs

Lines changed: 64 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,19 @@
99
using Plugin.Badge.Abstractions;
1010
using Xamarin.Forms.Platform.Android;
1111
using Android.Content;
12+
using Android.Support.V4.View;
13+
using Xamarin.Forms.PlatformConfiguration.AndroidSpecific;
14+
using TabbedPage = Xamarin.Forms.TabbedPage;
1215

1316
namespace Plugin.Badge.Droid
1417
{
1518
public class BadgedTabbedPageRenderer : TabbedPageRenderer
1619
{
1720
private const int DeleayBeforeTabAdded = 10;
1821
protected readonly Dictionary<Element, BadgeView> BadgeViews = new Dictionary<Element, BadgeView>();
19-
private TabLayout _tabLayout;
20-
private LinearLayout _tabStrip;
22+
private TabLayout _topTabLayout;
23+
private LinearLayout _topTabStrip;
24+
private ViewGroup _bottomTabStrip;
2125

2226
public BadgedTabbedPageRenderer(Context context) : base(context)
2327
{
@@ -31,18 +35,39 @@ protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e)
3135
Cleanup(e.OldElement);
3236
Cleanup(Element);
3337

34-
_tabLayout = ViewGroup.FindChildOfType<TabLayout>();
35-
if (_tabLayout == null)
38+
switch (this.Element.OnThisPlatform().GetToolbarPlacement())
3639
{
37-
Console.WriteLine("Plugin.Badge: No TabLayout found. Badge not added.");
38-
return;
39-
}
40-
41-
_tabStrip = _tabLayout.FindChildOfType<LinearLayout>();
42-
43-
for (var i = 0; i < _tabLayout.TabCount; i++)
44-
{
45-
AddTabBadge(i);
40+
case ToolbarPlacement.Default:
41+
case ToolbarPlacement.Top:
42+
_topTabLayout = ViewGroup.FindChildOfType<TabLayout>();
43+
if (_topTabLayout == null)
44+
{
45+
Console.WriteLine("Plugin.Badge: No TabLayout found. Badge not added.");
46+
return;
47+
}
48+
49+
_topTabStrip = _topTabLayout.FindChildOfType<LinearLayout>();
50+
51+
for (var i = 0; i < _topTabLayout.TabCount; i++)
52+
{
53+
AddTabBadge(i);
54+
}
55+
break;
56+
case ToolbarPlacement.Bottom:
57+
_bottomTabStrip = ViewGroup.FindChildOfType<BottomNavigationView>()?.GetChildAt(0) as ViewGroup;
58+
if (_bottomTabStrip == null)
59+
{
60+
Console.WriteLine("Plugin.Badge: No bottom tab layout found. Badge not added.");
61+
return;
62+
}
63+
64+
for (var i = 0; i < _bottomTabStrip.ChildCount; i++)
65+
{
66+
AddTabBadge(i);
67+
}
68+
break;
69+
default:
70+
throw new ArgumentOutOfRangeException();
4671
}
4772

4873
Element.ChildAdded += OnTabAdded;
@@ -52,24 +77,40 @@ protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e)
5277

5378
private void AddTabBadge(int tabIndex)
5479
{
80+
if (this.Element.OnThisPlatform().GetToolbarPlacement() == ToolbarPlacement.Bottom)
81+
{
82+
var target = _bottomTabStrip?.GetChildAt(tabIndex) as ViewGroup;
83+
target?.SetClipChildren(false);
84+
AddBadgeToTargetView(target, tabIndex);
85+
}
86+
else
87+
{
88+
AddBadgeToTargetView((_topTabLayout?.GetTabAt(tabIndex).CustomView ?? _topTabStrip?.GetChildAt(tabIndex)) as ViewGroup, tabIndex);
89+
}
90+
}
91+
92+
private void AddBadgeToTargetView(ViewGroup target, int tabIndex)
93+
{
94+
if (target == null)
95+
{
96+
Console.WriteLine("Plugin.Badge: Badge traget cannot be null. Badge not added.");
97+
}
98+
5599
var element = Element.Children[tabIndex];
56100
if (element is NavigationPage navigationPage)
57101
{
58102
//if the child page is a navigation page get its root page
59103
element = navigationPage.RootPage;
60104
}
61105

62-
var view = _tabLayout?.GetTabAt(tabIndex).CustomView ?? _tabStrip?.GetChildAt(tabIndex);
63-
64-
var badgeView = (view as ViewGroup)?.FindChildOfType<BadgeView>();
65-
106+
var badgeView = target.FindChildOfType<BadgeView>();
66107
if (badgeView == null)
67108
{
68-
var imageView = (view as ViewGroup)?.FindChildOfType<ImageView>();
109+
var imageView = target.FindChildOfType<ImageView>();
69110

70111
var badgeTarget = imageView?.Drawable != null
71112
? (Android.Views.View)imageView
72-
: (view as ViewGroup)?.FindChildOfType<TextView>();
113+
: target.FindChildOfType<TextView>();
73114

74115
//create badge for tab
75116
badgeView = new BadgeView(Context, badgeTarget);
@@ -83,6 +124,7 @@ private void AddTabBadge(int tabIndex)
83124
element.PropertyChanged += OnTabbedPagePropertyChanged;
84125
}
85126

127+
86128
protected virtual void OnTabbedPagePropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
87129
{
88130
if (!(sender is Element element))
@@ -133,8 +175,9 @@ private void Cleanup(TabbedPage page)
133175
page.ChildAdded -= OnTabAdded;
134176

135177
BadgeViews.Clear();
136-
_tabLayout = null;
137-
_tabStrip = null;
178+
_topTabLayout = null;
179+
_topTabStrip = null;
180+
_bottomTabStrip = null;
138181
}
139182
}
140183
}

Source/Plugin.Badge.Droid/Plugin.Badge.Droid.csproj

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3-
<Import Project="..\packages\Xamarin.Forms.2.5.0.280555\build\netstandard1.0\Xamarin.Forms.props" Condition="Exists('..\packages\Xamarin.Forms.2.5.0.280555\build\netstandard1.0\Xamarin.Forms.props')" />
3+
<Import Project="..\packages\Xamarin.Forms.3.1.0.583944\build\netstandard2.0\Xamarin.Forms.props" Condition="Exists('..\packages\Xamarin.Forms.3.1.0.583944\build\netstandard2.0\Xamarin.Forms.props')" />
44
<PropertyGroup>
55
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
66
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
@@ -40,7 +40,7 @@
4040
</PropertyGroup>
4141
<ItemGroup>
4242
<Reference Include="FormsViewGroup, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
43-
<HintPath>..\packages\Xamarin.Forms.2.5.0.280555\lib\MonoAndroid10\FormsViewGroup.dll</HintPath>
43+
<HintPath>..\packages\Xamarin.Forms.3.1.0.583944\lib\MonoAndroid10\FormsViewGroup.dll</HintPath>
4444
</Reference>
4545
<Reference Include="System" />
4646
<Reference Include="System.Xml" />
@@ -104,16 +104,16 @@
104104
<HintPath>..\packages\Xamarin.Android.Support.Vector.Drawable.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Vector.Drawable.dll</HintPath>
105105
</Reference>
106106
<Reference Include="Xamarin.Forms.Core, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
107-
<HintPath>..\packages\Xamarin.Forms.2.5.0.280555\lib\MonoAndroid10\Xamarin.Forms.Core.dll</HintPath>
107+
<HintPath>..\packages\Xamarin.Forms.3.1.0.583944\lib\MonoAndroid10\Xamarin.Forms.Core.dll</HintPath>
108108
</Reference>
109109
<Reference Include="Xamarin.Forms.Platform, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
110-
<HintPath>..\packages\Xamarin.Forms.2.5.0.280555\lib\MonoAndroid10\Xamarin.Forms.Platform.dll</HintPath>
110+
<HintPath>..\packages\Xamarin.Forms.3.1.0.583944\lib\MonoAndroid10\Xamarin.Forms.Platform.dll</HintPath>
111111
</Reference>
112112
<Reference Include="Xamarin.Forms.Platform.Android, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
113-
<HintPath>..\packages\Xamarin.Forms.2.5.0.280555\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll</HintPath>
113+
<HintPath>..\packages\Xamarin.Forms.3.1.0.583944\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll</HintPath>
114114
</Reference>
115115
<Reference Include="Xamarin.Forms.Xaml, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
116-
<HintPath>..\packages\Xamarin.Forms.2.5.0.280555\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll</HintPath>
116+
<HintPath>..\packages\Xamarin.Forms.3.1.0.583944\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll</HintPath>
117117
</Reference>
118118
</ItemGroup>
119119
<ItemGroup>
@@ -161,8 +161,8 @@
161161
<Error Condition="!Exists('..\packages\Xamarin.Android.Support.v7.AppCompat.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.v7.AppCompat.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Support.v7.AppCompat.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.v7.AppCompat.targets'))" />
162162
<Error Condition="!Exists('..\packages\Xamarin.Android.Support.Design.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Design.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Support.Design.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Design.targets'))" />
163163
<Error Condition="!Exists('..\packages\Xamarin.Android.Support.v7.MediaRouter.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.v7.MediaRouter.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Support.v7.MediaRouter.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.v7.MediaRouter.targets'))" />
164-
<Error Condition="!Exists('..\packages\Xamarin.Forms.2.5.0.280555\build\netstandard1.0\Xamarin.Forms.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Forms.2.5.0.280555\build\netstandard1.0\Xamarin.Forms.props'))" />
165-
<Error Condition="!Exists('..\packages\Xamarin.Forms.2.5.0.280555\build\netstandard1.0\Xamarin.Forms.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Forms.2.5.0.280555\build\netstandard1.0\Xamarin.Forms.targets'))" />
164+
<Error Condition="!Exists('..\packages\Xamarin.Forms.3.1.0.583944\build\netstandard2.0\Xamarin.Forms.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Forms.3.1.0.583944\build\netstandard2.0\Xamarin.Forms.props'))" />
165+
<Error Condition="!Exists('..\packages\Xamarin.Forms.3.1.0.583944\build\netstandard2.0\Xamarin.Forms.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Forms.3.1.0.583944\build\netstandard2.0\Xamarin.Forms.targets'))" />
166166
</Target>
167167
<Import Project="..\packages\Xamarin.Android.Support.Annotations.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Annotations.targets" Condition="Exists('..\packages\Xamarin.Android.Support.Annotations.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Annotations.targets')" />
168168
<Import Project="..\packages\Xamarin.Android.Arch.Core.Common.1.0.0\build\MonoAndroid80\Xamarin.Android.Arch.Core.Common.targets" Condition="Exists('..\packages\Xamarin.Android.Arch.Core.Common.1.0.0\build\MonoAndroid80\Xamarin.Android.Arch.Core.Common.targets')" />
@@ -183,5 +183,5 @@
183183
<Import Project="..\packages\Xamarin.Android.Support.v7.AppCompat.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.v7.AppCompat.targets" Condition="Exists('..\packages\Xamarin.Android.Support.v7.AppCompat.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.v7.AppCompat.targets')" />
184184
<Import Project="..\packages\Xamarin.Android.Support.Design.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Design.targets" Condition="Exists('..\packages\Xamarin.Android.Support.Design.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Design.targets')" />
185185
<Import Project="..\packages\Xamarin.Android.Support.v7.MediaRouter.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.v7.MediaRouter.targets" Condition="Exists('..\packages\Xamarin.Android.Support.v7.MediaRouter.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.v7.MediaRouter.targets')" />
186-
<Import Project="..\packages\Xamarin.Forms.2.5.0.280555\build\netstandard1.0\Xamarin.Forms.targets" Condition="Exists('..\packages\Xamarin.Forms.2.5.0.280555\build\netstandard1.0\Xamarin.Forms.targets')" />
186+
<Import Project="..\packages\Xamarin.Forms.3.1.0.583944\build\netstandard2.0\Xamarin.Forms.targets" Condition="Exists('..\packages\Xamarin.Forms.3.1.0.583944\build\netstandard2.0\Xamarin.Forms.targets')" />
187187
</Project>

Source/Plugin.Badge.Droid/packages.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,5 @@
1919
<package id="Xamarin.Android.Support.v7.Palette" version="26.1.0.1" targetFramework="monoandroid80" />
2020
<package id="Xamarin.Android.Support.v7.RecyclerView" version="26.1.0.1" targetFramework="monoandroid80" />
2121
<package id="Xamarin.Android.Support.Vector.Drawable" version="26.1.0.1" targetFramework="monoandroid80" />
22-
<package id="Xamarin.Forms" version="2.5.0.280555" targetFramework="monoandroid80" />
22+
<package id="Xamarin.Forms" version="3.1.0.583944" targetFramework="monoandroid80" />
2323
</packages>

Source/Plugin.Badge.Mac/Plugin.Badge.Mac.csproj

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3-
<Import Project="..\packages\Xamarin.Forms.2.5.0.280555\build\netstandard1.0\Xamarin.Forms.props" Condition="Exists('..\packages\Xamarin.Forms.2.5.0.280555\build\netstandard1.0\Xamarin.Forms.props')" />
3+
<Import Project="..\packages\Xamarin.Forms.3.1.0.583944\build\netstandard2.0\Xamarin.Forms.props" Condition="Exists('..\packages\Xamarin.Forms.3.1.0.583944\build\netstandard2.0\Xamarin.Forms.props')" />
44
<PropertyGroup>
55
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
66
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
@@ -58,16 +58,16 @@
5858
<Reference Include="System" />
5959
<Reference Include="System.Core" />
6060
<Reference Include="Xamarin.Forms.Core, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
61-
<HintPath>..\packages\Xamarin.Forms.2.5.0.280555\lib\Xamarin.Mac\Xamarin.Forms.Core.dll</HintPath>
61+
<HintPath>..\packages\Xamarin.Forms.3.1.0.583944\lib\Xamarin.Mac\Xamarin.Forms.Core.dll</HintPath>
6262
</Reference>
6363
<Reference Include="Xamarin.Forms.Platform, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
64-
<HintPath>..\packages\Xamarin.Forms.2.5.0.280555\lib\Xamarin.Mac\Xamarin.Forms.Platform.dll</HintPath>
64+
<HintPath>..\packages\Xamarin.Forms.3.1.0.583944\lib\Xamarin.Mac\Xamarin.Forms.Platform.dll</HintPath>
6565
</Reference>
6666
<Reference Include="Xamarin.Forms.Platform.macOS, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
67-
<HintPath>..\packages\Xamarin.Forms.2.5.0.280555\lib\Xamarin.Mac\Xamarin.Forms.Platform.macOS.dll</HintPath>
67+
<HintPath>..\packages\Xamarin.Forms.3.1.0.583944\lib\Xamarin.Mac\Xamarin.Forms.Platform.macOS.dll</HintPath>
6868
</Reference>
6969
<Reference Include="Xamarin.Forms.Xaml, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
70-
<HintPath>..\packages\Xamarin.Forms.2.5.0.280555\lib\Xamarin.Mac\Xamarin.Forms.Xaml.dll</HintPath>
70+
<HintPath>..\packages\Xamarin.Forms.3.1.0.583944\lib\Xamarin.Mac\Xamarin.Forms.Xaml.dll</HintPath>
7171
</Reference>
7272
<Reference Include="Xamarin.Mac" />
7373
</ItemGroup>
@@ -90,8 +90,8 @@
9090
<PropertyGroup>
9191
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
9292
</PropertyGroup>
93-
<Error Condition="!Exists('..\packages\Xamarin.Forms.2.5.0.280555\build\netstandard1.0\Xamarin.Forms.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Forms.2.5.0.280555\build\netstandard1.0\Xamarin.Forms.props'))" />
94-
<Error Condition="!Exists('..\packages\Xamarin.Forms.2.5.0.280555\build\netstandard1.0\Xamarin.Forms.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Forms.2.5.0.280555\build\netstandard1.0\Xamarin.Forms.targets'))" />
93+
<Error Condition="!Exists('..\packages\Xamarin.Forms.3.1.0.583944\build\netstandard2.0\Xamarin.Forms.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Forms.3.1.0.583944\build\netstandard2.0\Xamarin.Forms.props'))" />
94+
<Error Condition="!Exists('..\packages\Xamarin.Forms.3.1.0.583944\build\netstandard2.0\Xamarin.Forms.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Forms.3.1.0.583944\build\netstandard2.0\Xamarin.Forms.targets'))" />
9595
</Target>
96-
<Import Project="..\packages\Xamarin.Forms.2.5.0.280555\build\netstandard1.0\Xamarin.Forms.targets" Condition="Exists('..\packages\Xamarin.Forms.2.5.0.280555\build\netstandard1.0\Xamarin.Forms.targets')" />
96+
<Import Project="..\packages\Xamarin.Forms.3.1.0.583944\build\netstandard2.0\Xamarin.Forms.targets" Condition="Exists('..\packages\Xamarin.Forms.3.1.0.583944\build\netstandard2.0\Xamarin.Forms.targets')" />
9797
</Project>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<packages>
3-
<package id="Xamarin.Forms" version="2.5.0.280555" targetFramework="xamarinmac20" />
3+
<package id="Xamarin.Forms" version="3.1.0.583944" targetFramework="xamarinmac20" />
44
</packages>

0 commit comments

Comments
 (0)