Xamarin.Forms Android Tabbar自定义图标和文本

时间:2016-04-06 12:40:44

标签: android android-actionbar xamarin.forms tabpage appcompat-v7-r22.1

我已检查并使用以下链接实施: Android Action Bar Tabs, Styling the Icon and Text together 现在我可以看到文字上方的图像了。我想增加tabbar的高度,使图标的大小更大。 我还检查了How to change action bar size& https://blog.xamarin.com/material-design-for-your-xamarin-forms-android-apps/。我试图在我的Xamarin.Forms项目中实现AppCompatActivity。 首先,android活动源自global::Xamarin.Forms.Platform.Android.FormsApplicationActivity,现在转换为global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity。 并且TabbedPage实现了自定义渲染器。我知道必须将TabbedPageRender转换为AppCompatActivity。所以我也更新了渲染器。 但是现在没有调用自定义渲染器。并且我无法更改ActionBarAppCompatActivity放置的Tabbar的高度。 让我知道我的错误。 谢谢。

1 个答案:

答案 0 :(得分:1)

如果您有代码,请发布。

  1. 在您的活动中,检查您是否

    FormsAppCompatActivity.ToolbarResource = Resource.Layout.toolbar;         FormsAppCompatActivity.TabLayoutResource = Resource.Layout.tabs;

  2. 在OnCreate方法中,您还需要/ resources / layout文件夹中的toolbar.xml和tabs.xml。

    1. 在您的渲染器类中,请确保添加

      [assembly:ExportRenderer(typeof(YourTabbedPage),typeof(YourTabbedPageRenderer))]

    2. TabbedPageRenderer没有为您公开tablayout,因此需要反思

      public class YourTabbedPageRenderer:TabbedPageRenderer {     私人TabLayout _myTabLayout;

      protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e)
      {
          base.OnElementChanged(e);
      
          var fieldInfo = typeof (TabbedPageRenderer).GetField("_tabLayout", BindingFlags.Instance | BindingFlags.NonPublic);
          System.Diagnostics.Debug.Assert(fieldInfo != null, "fieldInfo != null");
          _myTabLayout = (TabLayout) fieldInfo.GetValue(this);
      
          // Uncomment to Disable scrolling
          //var propInfo = typeof (TabbedPageRenderer).GetProperty("UseAnimations", BindingFlags.Instance | BindingFlags.NonPublic);
          //propInfo.SetValue(this, false);
      
          if (e.OldElement != null)
          {
      
          }
      
          if (e.NewElement != null)
          {
              if (_myTabLayout.TabCount != this.Element.Children.Count)
                  return;
      
              for (int index = 0; index < this.Element.Children.Count; ++index)
              {
                  _myTabLayout.GetTabAt(index).SetText("");
      
                  FileImageSource icon = this.Element.Children[index].Icon;
      
                  if (string.IsNullOrEmpty(icon))
                      continue;
      
                  var imageView = new AppCompatImageView(this.Context);
                  imageView.SetPadding(4, 4, 4, 4);
                  var drawable = ResourceManager.GetDrawableByName(icon.File);
                  imageView.SetImageResource(drawable);
                  _myTabLayout.GetTabAt(index).SetCustomView(imageView);
              }
      
              _myTabLayout.GetTabAt(0).Select();
          }
      }
      

      }