Skip to content

Commit

Permalink
#48 Modify renderer for android bottom tabs in XF 3.1
Browse files Browse the repository at this point in the history
  • Loading branch information
xabre committed Sep 16, 2018
1 parent 19140e6 commit d79ad9d
Show file tree
Hide file tree
Showing 23 changed files with 166 additions and 101 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,4 @@ Thumbs.db
/tools
/.vscode
/.build/nuget
Source/.vs/Plugin.Badge/DesignTimeBuild/.dtbcache
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<TargetFramework>netstandard1.4</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Xamarin.Forms" Version="2.5.0.280555" />
<PackageReference Include="Xamarin.Forms" Version="3.1.0.583944" />
</ItemGroup>
<ItemGroup>
<Folder Include="Properties\" />
Expand Down
5 changes: 2 additions & 3 deletions Source/Plugin.Badge.Droid/BadgeView.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,8 @@ public Color BadgeColor

public Color TextColor
{
get { return new Color(CurrentTextColor); }
set { SetTextColor(value); }
get => new Color(CurrentTextColor);
set => SetTextColor(value);
}

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

group.SetClipChildren(false);
group.SetClipToPadding(false);


var container = new FrameLayout(_context);
var index = group.IndexOfChild(target);
Expand Down
3 changes: 1 addition & 2 deletions Source/Plugin.Badge.Droid/BadgeViewExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,7 @@ public static T FindChildOfType<T>(this ViewGroup parent) where T : View
var child = parent.GetChildAt(i);


var typedChild = child as T;
if (typedChild != null)
if (child is T typedChild)
{
return typedChild;
}
Expand Down
85 changes: 64 additions & 21 deletions Source/Plugin.Badge.Droid/BadgedTabbedPageRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,19 @@
using Plugin.Badge.Abstractions;
using Xamarin.Forms.Platform.Android;
using Android.Content;
using Android.Support.V4.View;
using Xamarin.Forms.PlatformConfiguration.AndroidSpecific;
using TabbedPage = Xamarin.Forms.TabbedPage;

namespace Plugin.Badge.Droid
{
public class BadgedTabbedPageRenderer : TabbedPageRenderer
{
private const int DeleayBeforeTabAdded = 10;
protected readonly Dictionary<Element, BadgeView> BadgeViews = new Dictionary<Element, BadgeView>();
private TabLayout _tabLayout;
private LinearLayout _tabStrip;
private TabLayout _topTabLayout;
private LinearLayout _topTabStrip;
private ViewGroup _bottomTabStrip;

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

_tabLayout = ViewGroup.FindChildOfType<TabLayout>();
if (_tabLayout == null)
switch (this.Element.OnThisPlatform().GetToolbarPlacement())
{
Console.WriteLine("Plugin.Badge: No TabLayout found. Badge not added.");
return;
}

_tabStrip = _tabLayout.FindChildOfType<LinearLayout>();

for (var i = 0; i < _tabLayout.TabCount; i++)
{
AddTabBadge(i);
case ToolbarPlacement.Default:
case ToolbarPlacement.Top:
_topTabLayout = ViewGroup.FindChildOfType<TabLayout>();
if (_topTabLayout == null)
{
Console.WriteLine("Plugin.Badge: No TabLayout found. Badge not added.");
return;
}

_topTabStrip = _topTabLayout.FindChildOfType<LinearLayout>();

for (var i = 0; i < _topTabLayout.TabCount; i++)
{
AddTabBadge(i);
}
break;
case ToolbarPlacement.Bottom:
_bottomTabStrip = ViewGroup.FindChildOfType<BottomNavigationView>()?.GetChildAt(0) as ViewGroup;
if (_bottomTabStrip == null)
{
Console.WriteLine("Plugin.Badge: No bottom tab layout found. Badge not added.");
return;
}

for (var i = 0; i < _bottomTabStrip.ChildCount; i++)
{
AddTabBadge(i);
}
break;
default:
throw new ArgumentOutOfRangeException();
}

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

private void AddTabBadge(int tabIndex)
{
if (this.Element.OnThisPlatform().GetToolbarPlacement() == ToolbarPlacement.Bottom)
{
var target = _bottomTabStrip?.GetChildAt(tabIndex) as ViewGroup;
target?.SetClipChildren(false);
AddBadgeToTargetView(target, tabIndex);
}
else
{
AddBadgeToTargetView((_topTabLayout?.GetTabAt(tabIndex).CustomView ?? _topTabStrip?.GetChildAt(tabIndex)) as ViewGroup, tabIndex);
}
}

private void AddBadgeToTargetView(ViewGroup target, int tabIndex)
{
if (target == null)
{
Console.WriteLine("Plugin.Badge: Badge traget cannot be null. Badge not added.");
}

var element = Element.Children[tabIndex];
if (element is NavigationPage navigationPage)
{
//if the child page is a navigation page get its root page
element = navigationPage.RootPage;
}

var view = _tabLayout?.GetTabAt(tabIndex).CustomView ?? _tabStrip?.GetChildAt(tabIndex);

var badgeView = (view as ViewGroup)?.FindChildOfType<BadgeView>();

var badgeView = target.FindChildOfType<BadgeView>();
if (badgeView == null)
{
var imageView = (view as ViewGroup)?.FindChildOfType<ImageView>();
var imageView = target.FindChildOfType<ImageView>();

var badgeTarget = imageView?.Drawable != null
? (Android.Views.View)imageView
: (view as ViewGroup)?.FindChildOfType<TextView>();
: target.FindChildOfType<TextView>();

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


protected virtual void OnTabbedPagePropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (!(sender is Element element))
Expand Down Expand Up @@ -133,8 +175,9 @@ private void Cleanup(TabbedPage page)
page.ChildAdded -= OnTabAdded;

BadgeViews.Clear();
_tabLayout = null;
_tabStrip = null;
_topTabLayout = null;
_topTabStrip = null;
_bottomTabStrip = null;
}
}
}
18 changes: 9 additions & 9 deletions Source/Plugin.Badge.Droid/Plugin.Badge.Droid.csproj
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<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')" />
<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')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
Expand Down Expand Up @@ -40,7 +40,7 @@
</PropertyGroup>
<ItemGroup>
<Reference Include="FormsViewGroup, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Forms.2.5.0.280555\lib\MonoAndroid10\FormsViewGroup.dll</HintPath>
<HintPath>..\packages\Xamarin.Forms.3.1.0.583944\lib\MonoAndroid10\FormsViewGroup.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Xml" />
Expand Down Expand Up @@ -104,16 +104,16 @@
<HintPath>..\packages\Xamarin.Android.Support.Vector.Drawable.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Vector.Drawable.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Core, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Forms.2.5.0.280555\lib\MonoAndroid10\Xamarin.Forms.Core.dll</HintPath>
<HintPath>..\packages\Xamarin.Forms.3.1.0.583944\lib\MonoAndroid10\Xamarin.Forms.Core.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Platform, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Forms.2.5.0.280555\lib\MonoAndroid10\Xamarin.Forms.Platform.dll</HintPath>
<HintPath>..\packages\Xamarin.Forms.3.1.0.583944\lib\MonoAndroid10\Xamarin.Forms.Platform.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Platform.Android, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Forms.2.5.0.280555\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll</HintPath>
<HintPath>..\packages\Xamarin.Forms.3.1.0.583944\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Xaml, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Forms.2.5.0.280555\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll</HintPath>
<HintPath>..\packages\Xamarin.Forms.3.1.0.583944\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
Expand Down Expand Up @@ -161,8 +161,8 @@
<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'))" />
<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'))" />
<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'))" />
<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'))" />
<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'))" />
<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'))" />
<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'))" />
</Target>
<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')" />
<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')" />
Expand All @@ -183,5 +183,5 @@
<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')" />
<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')" />
<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')" />
<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')" />
<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')" />
</Project>
2 changes: 1 addition & 1 deletion Source/Plugin.Badge.Droid/packages.config
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,5 @@
<package id="Xamarin.Android.Support.v7.Palette" version="26.1.0.1" targetFramework="monoandroid80" />
<package id="Xamarin.Android.Support.v7.RecyclerView" version="26.1.0.1" targetFramework="monoandroid80" />
<package id="Xamarin.Android.Support.Vector.Drawable" version="26.1.0.1" targetFramework="monoandroid80" />
<package id="Xamarin.Forms" version="2.5.0.280555" targetFramework="monoandroid80" />
<package id="Xamarin.Forms" version="3.1.0.583944" targetFramework="monoandroid80" />
</packages>
16 changes: 8 additions & 8 deletions Source/Plugin.Badge.Mac/Plugin.Badge.Mac.csproj
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<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')" />
<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')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
Expand Down Expand Up @@ -58,16 +58,16 @@
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="Xamarin.Forms.Core, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Forms.2.5.0.280555\lib\Xamarin.Mac\Xamarin.Forms.Core.dll</HintPath>
<HintPath>..\packages\Xamarin.Forms.3.1.0.583944\lib\Xamarin.Mac\Xamarin.Forms.Core.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Platform, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Forms.2.5.0.280555\lib\Xamarin.Mac\Xamarin.Forms.Platform.dll</HintPath>
<HintPath>..\packages\Xamarin.Forms.3.1.0.583944\lib\Xamarin.Mac\Xamarin.Forms.Platform.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Platform.macOS, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Forms.2.5.0.280555\lib\Xamarin.Mac\Xamarin.Forms.Platform.macOS.dll</HintPath>
<HintPath>..\packages\Xamarin.Forms.3.1.0.583944\lib\Xamarin.Mac\Xamarin.Forms.Platform.macOS.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Xaml, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Forms.2.5.0.280555\lib\Xamarin.Mac\Xamarin.Forms.Xaml.dll</HintPath>
<HintPath>..\packages\Xamarin.Forms.3.1.0.583944\lib\Xamarin.Mac\Xamarin.Forms.Xaml.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Mac" />
</ItemGroup>
Expand All @@ -90,8 +90,8 @@
<PropertyGroup>
<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>
</PropertyGroup>
<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'))" />
<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'))" />
<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'))" />
<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'))" />
</Target>
<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')" />
<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')" />
</Project>
2 changes: 1 addition & 1 deletion Source/Plugin.Badge.Mac/packages.config
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Xamarin.Forms" version="2.5.0.280555" targetFramework="xamarinmac20" />
<package id="Xamarin.Forms" version="3.1.0.583944" targetFramework="xamarinmac20" />
</packages>
Loading

0 comments on commit d79ad9d

Please sign in to comment.