0

私のプロジェクトでをTab barに表示するためにcustom TabbedPageを使用しています。私はcustom tab barを表示するために以下のコードを使用していますが、nullの値はCustomTabbedPageRenderer.csクラスOnWindowVisibilityChangedのメソッドactivity.ActionBarに常に戻ります。 ThemeTheme.AppCompat.Light.DarkActionBarに変更し、Window.RequestFeature(WindowFeatures.ActionBar);MainActivity.csに次の行を追加したような多くの回避策を試しましたが、残念ながらこれらは私を助けませんでした。XamarinフォームAndroidカスタムTabbed 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

私は、カスタムタブバーを示すため、以下のコードを使用していますが、それは常にCustomTabbedPageRenderer.csクラスOnWindowVisibilityChangedメソッドの中でnull値を返しますactivity.ActionBar

アクティビティに決して設定されていないため、ActionBarはnullです。あなたは最初のアクションバーを設定する必要があります。MainActivity.cs

  1. は、以下のような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. デフォルト1を置き換えるために、独自のテーマを作成します。 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. using Android.Support.V7.AppAndroid.AppからActionBarの名前空間を変更し、activity.SupportActionBarを通じてActionBarを取得し、あなたのCustomTabPageRenderer.cs変更します

    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 Xia - MSFT、私はあなたの '提案 'に従ってコードを変更しましたが、今は' activity.SupportActionBar'では 'activity.SupportActionBar'の値を取得しています。'List filenames'に' 4'の項目が含まれていても、NavigationItemCount'は '0'で設定されています – Jamal

+0

独自の' ActionBar'を定義しました。まったく新しい 'ActionBar'です。だから、自分で項目を追加する必要があります。ナビゲーションオプションは自動的に追加されません。 –

+0

私はあなたの* Home.cs *の可能性のある 'Burger.cs'、' Sandwich.cs'、 'Pizza.cs'、' Roll.cs'に 'Tab Pages'を追加するための' sample'を提供してください。 – Jamal

関連する問題