【问题标题】:xamarin custom navigation barxamarin 自定义导航栏
【发布时间】:2018-03-11 11:47:27
【问题描述】:

我尝试在导航栏中设置搜索栏。我用这段代码做到了:

public class NavigationSearchRenderer : PageRenderer
{
    private SearchView _searchView;
    public NavigationSearchRenderer(Context context) : base(context)
    {

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

        var navPage = Element as NavigationSearchPage;
        if (navPage == null)
            return;

        var activity = this.Context as FormsAppCompatActivity;
        if (activity == null)
            return;

        var toolbar = activity.FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
        _searchView = new SearchView(Context);
        toolbar.AddView(_searchView);
    }

}

它可以工作,但现在所有导航栏都有搜索栏,我只想要从 NavigationSearchPage 继承的页面。

我也这样表示导出:

[assembly: ExportRenderer(typeof(NavigationSearchPage), typeof(NavigationSearchRenderer))]

【问题讨论】:

    标签: android xamarin navigationbar


    【解决方案1】:

    它可以工作,但现在所有导航栏都有搜索栏,我只想要从 NavigationSearchPage 继承的页面。

    您的所有页面都有搜索栏,因为当您导航时,NavigationPage 永远不会刷新。而且由于您的渲染器仅将 SearchView 添加到工具栏而从不清除它。您添加的 SearchView 将始终存在。

    解决方案:

    1. 修改这个渲染器来渲染你项目中的所有页面,你可以使用超类作为ExportRenderer的第一个参数。例如,如果您所有的页面都是ContentPage 类型,那么像这样注册您的渲染器:

      [assembly:ExportRenderer(typeof(ContentPage),
        typeof(NavigationSearchRenderer))]
      
    2. 修改您的OnElementChanged 以在NavigationSearchPage 时添加SearchView 并在其他页面时清除SearchView

      protected override void OnElementChanged(ElementChangedEventArgs<Page> e)
      {
          base.OnElementChanged(e);
      
          var activity = this.Context as FormsAppCompatActivity;
          if (activity == null)
              return;
      
          if (Element is NavigationSearchPage)
          {
              var toolbar = activity.FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
              _searchView = new SearchView(Context);
              toolbar.AddView(_searchView);
          }
          else
          {
              var page = (Element as ContentPage);
              if (page == null)
              {
                  return;
              }
              var toolbar = activity.FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
              int count = toolbar.ChildCount;
              for (int i = 0; i < count; i++)
              {
                  Android.Views.View child =toolbar.GetChildAt(i);
                  if (child is SearchView)
                  {
                      toolbar.RemoveView(child);
                  }
              }
          }
      }
      

    【讨论】:

      猜你喜欢
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多