0

我在我的项目中使用custom TabbedPageTab bar中显示badges(count)。我正在使用下面的代码来显示custom tab bar,但它总是返回nullCustomTabbedPageRenderer.csOnWindowVisibilityChanged方法的activity.ActionBar。我已经尝试了许多解决办法如改变ThemeTheme.AppCompat.Light.DarkActionBar和加入Window.RequestFeature(WindowFeatures.ActionBar);MainActivity.cs下面的线,但遗憾的是这些并没有帮助我。Xamarin形式Android自定义TabbedPage ActionBar返回null

MainActivity.cs

namespace Bakery.Droid 
    { 
     [Activity(Label = "Bakery.Droid", Icon = "@mipmap/icon_launcher", Theme = "@style/MyTheme", MainLauncher = false, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation, ScreenOrientation = ScreenOrientation.Portrait)] 
     public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity 
     { 
       protected override void OnCreate(Bundle bundle) 
       { 

        base.OnCreate(bundle); 

        global::Xamarin.Forms.Forms.Init(this, bundle);   

        LoadApplication(new App()); 
       } 


      } 

     } 

Home.cs

using System; 
using System.Collections.Generic; 
using Xamarin.Forms; 

namespace Bakery 
{ 
    public class Home : CustomTabPage 
    { 
     public Home() 
     { 

      NavigationPage.SetHasNavigationBar(this, false); 

      var burger = new NavigationPage(new Burger()); 
      burger.Icon = "burger.png"; 
      burger.Title = "Burger"; 

      var sandwich = new NavigationPage(new Sandwich()); 
      sandwich.Icon = "sandwich.png"; 
      sandwich.Title = "Sandwich"; 

      var pizza = new NavigationPage(new Pizza()); 
      pizza.Icon = "pizza.png"; 
      pizza.Title = "Pizza"; 


      var roll = new NavigationPage(new Roll()); 
      roll.Icon = "roll.png"; 
      roll.Title = "Roll"; 

      //adding childrens into the tab 
      Children.Clear(); 
      Children.Add(burger); 
      Children.Add(sandwich); 
      Children.Add(pizza); 
      Children.Add(roll); 
     } 

     protected override void OnAppearing() 
     { 
      base.OnAppearing();  
     } 
    } 
} 

CustomTabPage.cs

using System; 
using Xamarin.Forms; 

namespace Bakery 
{ 
    public class CustomTabPage : TabbedPage 
    { 

    } 
} 

个styles.xml

<?xml version="1.0" encoding="UTF-8"?> 
<resources> 
    <style name="MyTheme" parent="MyTheme.Base"> 
    </style> 

    <style name="MyTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar"> 

     <item name="windowNoTitle">true</item> 

     <item name="windowActionBar">true</item>   

     <item name="windowActionModeOverlay">true</item>   


    </style> 

</resources> 

CustomTabbedPageRenderer.cs

[assembly: ExportRenderer(typeof(TabbedPage), typeof(CustomTabbedPageRenderer))] 
    namespace Bakery.Droid 
    { 
     public class CustomTabbedPageRenderer : TabbedRenderer 
     { 
      Activity activity; 
      List<string> filenames; 

      protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e) 
      { 
       base.OnElementChanged(e); 
       filenames = e.NewElement.Children.Select(t => t.Icon.File).ToList(); 
      } 

      protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
      { 
       base.OnElementPropertyChanged(sender, e); 
       activity = this.Context as Activity; 
      } 

      protected override void OnWindowVisibilityChanged(Android.Views.ViewStates visibility) 
      { 
       try 
       { 
        base.OnWindowVisibilityChanged(visibility); 
        var actionBar = activity.ActionBar; 
        var colorDrawable = new ColorDrawable(Android.Graphics.Color.Yellow); 
        actionBar.SetStackedBackgroundDrawable(colorDrawable); 
        System.Diagnostics.Debug.WriteLine("Onwindow visible"); 
        ActionBarTabsSetup(actionBar); 
       } 
       catch (Exception Exception) 
       { 
        System.Diagnostics.Debug.WriteLine("Exception: " + Exception.ToString()); 
       } 
      } 

      void ActionBarTabsSetup(ActionBar actionBar) 
      { 
       for (var i = 0; i < actionBar.NavigationItemCount; ++i) 
       { 
        var tab = actionBar.GetTabAt(i); 
        var id = GetImageFromFilename(i); 
        if (id != 0) 
         TabSetup(tab, id); 
       } 
      } 

      void TabSetup(ActionBar.Tab tab, int resID) 
      { 
       var relLay = new Android.Widget.RelativeLayout(activity) 
       { 
        LayoutParameters = new LayoutParams(LayoutParams.WrapContent, 180) 

       }; 

       var linLay = new LinearLayout(activity) 
       { 
        LayoutParameters = new LayoutParams(LayoutParams.WrapContent, 180), 
        Orientation = Orientation.Vertical, 
       }; 
       linLay.SetHorizontalGravity(Android.Views.GravityFlags.Center); 
       var imageView = new ImageView(activity); 
       imageView.SetImageResource(resID); 
       imageView.SetPadding(-35, 4, -35, 0); 
       imageView.SetMinimumWidth(60); 

       var textView = new TextView(activity) 
       { 
        Text = tab.Text 
       }; 


       linLay.AddView(imageView); 
       linLay.AddView(textView);  

       relLay.AddView(linLay); 

       var badgeView = new TextView(activity) 
       { 
        Text = "2" 
       }; 

       var badgeImageView = new ImageView(activity); 
       badgeImageView.SetImageResource(Resource.Drawable.red); 
       badgeImageView.SetMinimumWidth(5); 
       badgeImageView.SetMinimumHeight(5); 
       badgeImageView.SetPadding(77, 5, 0, 0); 
       badgeView.SetPadding(85, 0, 0, 0); 

       relLay.AddView(badgeImageView); 
       relLay.AddView(badgeView); 
       tab.SetCustomView(relLay); 
      } 

      int GetImageFromFilename(int n) 
      { 
       var filename = filenames[n].Split('.'); 
       var id = Resources.GetIdentifier(filename[0], "drawable", activity.PackageName); 
       return id; 
      } 
     } 
    } 

回答

1

我使用下面的代码显示自定义标签栏,但它总是返回nullCustomTabbedPageRenderer.csOnWindowVisibilityChanged方法的activity.ActionBar

该ActionBar是null,因为它从来没有在活动中设置。您需要先设置动作条:

  1. MainActivity.cs设置SupportActionBar象下面这样:

    //Create your own theme "MyTheme" 
    [Activity(Label = "CustomTabbedPageDemo", Icon = "@drawable/icon", Theme = "@style/MyTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)] 
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity 
    { 
        protected override void OnCreate(Bundle bundle) 
        { 
         //Get the ActionBar Layout in Resouce\layout\Toolbar.axml 
         var toolbar=(Toolbar)LayoutInflater.Inflate(Resource.Layout.Toolbar, null); 
         //Set the Support ActionBar 
         SetSupportActionBar(toolbar); 
         SupportActionBar.Title = "My ActionBar"; 
         base.OnCreate(bundle); 
    
         global::Xamarin.Forms.Forms.Init(this, bundle); 
        LoadApplication(new App()); 
        } 
    } 
    
  2. 创建自己的主题替换默认的一个。 Xamarin.Forms要求主题从Theme.AppCompat.XXX.XXX继承:

    <style name="MyTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
        <item name="windowNoTitle">true</item> 
        <item name="windowActionBar">false</item> 
        <item name="colorPrimary">#5A8622</item> 
    </style> 
    
  3. 基本Toolbar.axml例如:

    <?xml version="1.0" encoding="utf-8"?> 
    <android.support.v7.widget.Toolbar 
        xmlns:android="http://schemas.android.com/apk/res/android" 
        android:id="@+id/toolbar" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:background="?attr/colorPrimary" 
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/> 
    
  4. 修改您CustomTabPageRenderer.csAndroid.App改变ActionBar的命名空间using Android.Support.V7.App和检索ActionBar通过activity.SupportActionBar

    using Android.Support.V7.App; 
    ... 
    protected override void OnWindowVisibilityChanged(Android.Views.ViewStates visibility) 
    { 
        try 
        { 
         base.OnWindowVisibilityChanged(visibility); 
         //get the support actionbar 
         var actionBar = activity.SupportActionBar; 
    
         var colorDrawable = new ColorDrawable(Android.Graphics.Color.Yellow); 
         actionBar.SetStackedBackgroundDrawable(colorDrawable); 
         System.Diagnostics.Debug.WriteLine("Onwindow visible"); 
    
         ActionBarTabsSetup(actionBar); 
        } 
        catch (Exception Exception) 
        { 
         System.Diagnostics.Debug.WriteLine("Exception: " + Exception.ToString()); 
        } 
    } 
    
+0

谢谢@Elvis夏 - MSFT,我改变了代码,根据你的'建议'现在我得到'activity.SupportActionBar'的值,但activity.SupportActionBar。即使列表文件名包含“4”项目,“NavigationItemCount”也设置为'0' – Jamal

+0

您已定义自己的“ActionBar”。这是一个全新的“ActionBar”。所以你需要自己添加项目。导航选项不会自动添加到它。 –

+0

您能否提供任何样本来添加我在* Home.cs *中可能包含的'Tab Pages',可能是'Burger.cs','Sandwich.cs','Pizza.cs','Roll.cs' – Jamal