Press ESC to close

Xamarin Forms Android Shifting Kapatmak

Merhaba arkadaşlar. Bu yazımda Xamarin Forms ile Tabbed Page kullanırken Android için yaşanılan sıkıntılar için çözümlerden bahsedeceğim. Biliyorsunuz ki Xamarin Forms sürekli gelişen bir yapıda ama Android için Tabbed Page biraz sıkıntılı. Örneğin müşteriniz sizden Tabbed Page kullanılmış bir sayfa istedi ve iOS Android tarafı da aynı olması gerekiyor. Siz projenize Tabbed Page ekledikten sonra iOS tarafında tabler aşağıda gözükürken, Android için yukarıda gözükmekte. Bu sıkıntıyı çözmek için projemizde sayfamızın olduğu kısma gelip aşağıda ki kod satırını entegre etmemiz gerekiyor.

xmlns:android="clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core" android:TabbedPage.ToolbarPlacement="Bottom"

Böylelikle aslında Android’e özel olarak aşağıda yer aldırtabiliyoruz.

Diğer bir sorun ise Android’de e’den fazla tab sayfası olduğunda; tablerde bulunan yazılar gidiyor sadece ikonları kalıyor. Sadece seçtiğimiz Tab’in yazısı ve ikonunda büyüme oluyor.  Bu da aslında göze pek hoş gelmiyor. Buna Android’de Shifting deniyor. Bu özelliği kapatmak için Custom Renderer yazmamız gerekmekte. Custom Renderer hakkında daha fazla bilgi almak istiyorsanız buradan ulaşabilirsiniz.

public class CustomTabbedPageRenderer : TabbedPageRenderer
    {
        public CustomTabbedPageRenderer(Context context) : base(context) { }

        protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e)
        {
            base.OnElementChanged(e);

            if (ViewGroup != null && ViewGroup.ChildCount > 0)
            {
                BottomNavigationMenuView bottomNavigationMenuView = FindChildOfType<BottomNavigationMenuView>(ViewGroup);

                if (bottomNavigationMenuView != null)
                {
                    var shiftMode = bottomNavigationMenuView.Class.GetDeclaredField("mShiftingMode");

                    shiftMode.Accessible = true;
                    shiftMode.SetBoolean(bottomNavigationMenuView, false);
                    shiftMode.Accessible = false;
                    shiftMode.Dispose();

                    for (var i = 0; i < bottomNavigationMenuView.ChildCount; i++)
                    {
                        var item = bottomNavigationMenuView.GetChildAt(i) as BottomNavigationItemView;
                        if (item == null) continue;

                        item.SetShiftingMode(false);
                        item.SetChecked(item.ItemData.IsChecked);
                    }

                    if (bottomNavigationMenuView.ChildCount > 0) bottomNavigationMenuView.UpdateMenuView();
                }
            }
        }

        private T FindChildOfType<T>(ViewGroup viewGroup) where T : Android.Views.View
        {
            if (viewGroup == null || viewGroup.ChildCount == 0) return null;

            for (var i = 0; i < viewGroup.ChildCount; i++)
            {
                var child = viewGroup.GetChildAt(i);

                var typedChild = child as T;
                if (typedChild != null) return typedChild;

                if (!(child is ViewGroup)) continue;

                var result = FindChildOfType<T>(child as ViewGroup);

                if (result != null) return result;
            }

            return null;
        }
    }

Bu sayede artık tabler arası geçiş yaparken shifting olmayacak.

Sorularınız olursa mail veya yorum atarak ulaşabilirsiniz. İyi çalışmalar.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir