为Xamarin.Forms的导航栏增加搜索功能

在使用NavigationPage导航的时候, 我们可以给里面添加一些功能按钮, 如下所示:

    <ContentPage.ToolbarItems>
        <ToolbarItem/>
        <ToolbarItem/>
    </ContentPage.ToolbarItems>

但是如果需要给这个控件添加一些其他的控件的时候, 则无法满足我们的需求, 这个时候, 我们就需要使用 页面渲染器(Page Renderer)。

真机效果演示:

实现思路:

  • 1.添加用于搜索通知的接口 : ISearchPage
  • 2.自定义搜索的渲染器 : SearchPageRender
  • 3.添加Menu/Item Xml文件: mainmenu.xml
  • 4.添加 Nuget:Plugin.CurrentActivity
  • 5.给需要添加搜索功能的页面实现 (1)的接口
  • 6.为自定义搜索渲染器添加支持该功能的页面
  • 7.启动项初始化 : CrossCurrentActivity.Current.Init(this, savedInstanceState)

添加搜索通知接口

    public interface ISearchPage
    {
        void OnSearchBarTextChanged(string text);
    }

自定义渲染器

在Android项目中创建 CustomRender文件夹定义 SearchPageRender

SearchPageRender代码

     public class SearchPageRender : PageRenderer
    {
        public SearchPageRender(Context context) : base(context)
        {

        }

        protected override void OnAttachedToWindow()
        {
            base.OnAttachedToWindow();

            if (Element is ISearchPage
                && Element is Page page
                && page.Parent is NavigationPage navigationPage)
            {
                //Workaround to re-add the SearchView when navigating back to an ISearchPage, because Xamarin.Forms automatically removes it
                navigationPage.Popped += HandleNavigationPagePopped;
                navigationPage.PoppedToRoot += HandleNavigationPagePopped;
            }
        }

        //Adding the SearchBar in OnSizeChanged ensures the SearchBar is re-added after the device is rotated, because Xamarin.Forms automatically removes it
        protected override void OnSizeChanged(int w, int h, int oldw, int oldh)
        {
            base.OnSizeChanged(w, h, oldw, oldh);

            if (Element is ISearchPage && Element is Page page && page.Parent is NavigationPage navigationPage && navigationPage.CurrentPage is ISearchPage)
            {
                AddSearchToToolbar(page.Title);
            }
        }

        protected override void Dispose(bool disposing)
        {
            if (GetToolbar() is Android.Support.V7.Widget.Toolbar toolBar)
                toolBar.Menu?.RemoveItem(Resource.Menu.mainmenu);

            base.Dispose(disposing);
        }

        //Workaround to re-add the SearchView when navigating back to an ISearchPage, because Xamarin.Forms automatically removes it
        void HandleNavigationPagePopped(object sender, NavigationEventArgs e)
        {
            if (sender is NavigationPage navigationPage
                && navigationPage.CurrentPage is ISearchPage)
            {
                AddSearchToToolbar(navigationPage.CurrentPage.Title);
            }
        }

        void AddSearchToToolbar(string pageTitle)
        {
            if (GetToolbar() is Android.Support.V7.Widget.Toolbar toolBar
            && toolBar.Menu?.FindItem(Resource.Id.action_search)?.ActionView?.
            JavaCast<Android.Support.V7.Widget.SearchView>().GetType()
            != typeof(Android.Support.V7.Widget.SearchView))
            {
                toolBar.Title = pageTitle;
                toolBar.InflateMenu(Resource.Menu.mainmenu);

                if (toolBar.Menu?.FindItem(Resource.Id.action_search)?.ActionView?.
                    JavaCast<Android.Support.V7.Widget.SearchView>() is
                     Android.Support.V7.Widget.SearchView searchView)
                {
                    searchView.QueryTextChange += SearchView_QueryTextChange;
                    searchView.ImeOptions = (int)ImeAction.Search;
                    searchView.InputType = (int)InputTypes.TextVariationFilter;
                    searchView.MaxWidth = int.MaxValue;
                }
            }
        }

        private void SearchView_QueryTextChange(object sender, Android.Support.V7.Widget.SearchView.QueryTextChangeEventArgs e)
        {
            if (Element is ISearchPage searchPage)
                searchPage.OnSearchBarTextChanged(e.NewText);
        }

        private static Android.Support.V7.Widget.Toolbar GetToolbar() => (CrossCurrentActivity.Current?.Activity as MainActivity)?.FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
    }

添加Xml文件引用SearchView

创建mainmenu.xml

在Android的Resources文件夹中, 创建menu文件夹创建mainmenu.xml文件, 如下:

mainmenu.xml

    <?xml version="1.0" encoding="utf-8" ?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
	<item android:id="@+id/action_search"
		  android:title="Search"
		  android:icon="@android:drawable/ic_menu_search"
		  app:showAsAction="always|collapseActionView"
		  app:actionViewClass="android.support.v7.widget.SearchView"/>
</menu>

添加NuGet:Plugin.CurrentActivity

在Android项目中, 添加NuGet包: Plugin.CurrentActivity , 并且在SearchPageRender 中引用它。

页面实现接口 ISearchPage

渲染器添加实现页

如下图所示, 第一个typeof 指向的就是实现搜索内容页的Page

MainActivity初始化

在MainActivity的 OnCreate 中, 添加初始化的代码, 如下:

以上步骤完整之后, 通过导航页打开的页面即可自带搜索功能。

到此这篇关于为Xamarin.Forms的导航栏增加搜索功能的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • c#使用xamarin编写拨打电话程序

    xamarin 可以很方便的编写一个电话拨号程序,下面的代码是调用android系统的拨号功能,拨号前会给出一个提示信息. callButton是一个用来拨号的按钮,我们使用它的点击事件来进行拨号,拨号前会有一个提示框 callButton.Click += (object sender, EventArgs e) => { // On "Call" button click, try to dial phone number. sharejs.com var callDialo

  • C#对Xamarin框架进行数据绑定

    关于数据绑定 Xamarin 单向.双向绑定 Xaml绑定 C#代码绑定 在此之前,几段 伪代码 帮助像我一样菜的同学入门... 假如说,有两个控件,一个是滑动条(Slider),一个是显示文本的标签(Label). Slider slider = new Slider() { Maximum = 1, Value = 10 }; Label label = new Label(); label.Text = slider.Value.ToString(); 滑动条(Slider)滑动的最小单位

  • 详解xamarin Android 实现ListView万能适配器

    详解xamarin Android 实现ListView万能适配器 早些时候接触xamarin Android 的列表,写了很多ListView的Adapter,建一个ListView就写一个Adapter,每一个Adapter里面还有去写一个ViewHolder的类来优化,自从看了hongyang博客的listview万能适配器的文章,学习良多,所以就写篇关于xamarin android ListView通用适配器的文章. 本章主要分为以下三点: 打造通用的ViewHolder优化ListV

  • Android将Xamarin For VS升级为4.1.0.530版教程

    一.Xamarin for VS的版本简介 下面是Xamarin for VS发布的版本简介: --更早的版本(略) 2015年11月发布:Xamarin for VS 4.0.0.1717 Stable版(收费) 2016年3月发布:Xamarin for VS 4.0.1.145 Stable版(收费) 2016年5月发布:Xamarin for VS 4.0.4.4 Stable版(企业版,免费) 2016年6月发布:Xamarin for VS 4.1.0.530 Stable版(企业版

  • C# Xamarin利用ZXing.Net.Mobile进行扫码的方法

    前言 很多人觉得Xamarin的开源少,没法用来开发项目. 但,实际上Xamarin已经有很多开源代码了:只要不是特别特殊的项目,基本上是都可以满足开发. 下面我们来看一下Xamarin中利用开源代码ZXing.Net.Mobile进行扫码. 引用ZXing.Net.Mobile 在Xamarin中进行扫码,需要先引用开源代码ZXing.Net.Mobile. 下面我们先打开Nuget,搜索ZXing.Net.Mobile,如下图: 然后我们点击右侧安装. 接着VisualStudio可能会提示

  • 详解Xamarin.Android 利用Fragment实现底部菜单

    本篇文章主要介绍了详解Xamarin.Android 利用Fragment实现底部菜单,分享给大家,具体如下: 效果图: 第一步:添加引用 引用 Crosslight.Xamarin.Android.Support.v7.AppCompat 这个包. 第二步:绘制Main和Fragment界面 fg_home.axml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:androi

  • .NET Core、Xamarin、.NET Standard和.NET Framework四者之间的区别介绍

    前段时日微软(Microsoft)正式发布了.NET Core 2.0,在很多开发社区中反响不错.但还是有一些开发者发出了疑问,.NET Core.Xamarin..NET Standard和.NET Framework之间有哪些不同呢?本文就为大家简单描述一下这四者之间的区别. .NET Core .NET Core是免费.跨平台的,是托管框架的开源实现.它支持4种类型的应用程序:控制台.http://ASP.NET Core.云和通用Windows平台(UWP).Windows Forms和

  • 为Xamarin.Forms的导航栏增加搜索功能

    在使用NavigationPage导航的时候, 我们可以给里面添加一些功能按钮, 如下所示: <ContentPage.ToolbarItems> <ToolbarItem/> <ToolbarItem/> </ContentPage.ToolbarItems> 但是如果需要给这个控件添加一些其他的控件的时候, 则无法满足我们的需求, 这个时候, 我们就需要使用 页面渲染器(Page Renderer). 真机效果演示: 实现思路: 1.添加用于搜索通知的接

  • 微信小程序scroll-view实现滚动到锚点左侧导航栏点餐功能(点击种类,滚动到锚点)

    1.wxml代码: <view class="page"> <import src="../../components/catering-item/catering-item.wxml" /> <!-- 左侧滚动栏 --> <view class='under_line'></view> <view class="body"> <view style='float: l

  • jQuery EasyUI tree增加搜索功能的实现方法

    扩展jQuery EasyUI tree搜索树节点的方法,使其支持节点名称的模糊匹配,将不匹配的节点隐藏. /** * 1)扩展jquery easyui tree的节点检索方法.使用方法如下: * $("#treeId").tree("search", searchText); * 其中,treeId为easyui tree的根UL元素的ID,searchText为检索的文本. * 如果searchText为空或"",将恢复展示所有节点为正常状

  • 微信小程序导航栏滑动定位功能示例(实现CSS3的positionsticky效果)

    本文实例讲述了微信小程序导航栏滑动定位功能.分享给大家供大家参考,具体如下: 实现的效果 实现的原理 1. 通过对scroll的监听获取滚动条的scrollTop值; 2. 在导航的class判断scrollTop; 3. 切换position:fixed与position:relative. WXML <view style="height:100%;position:fixed;width:100%;"> <scroll-view scroll-y="f

  • 微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)

    本文实例讲述了微信小程序MUI导航栏透明渐变功能.分享给大家供大家参考,具体如下: 导航栏透明渐变效果 实现原理 1. 利用position:absolute在导航下定位一个view作为背景渐变使用; 2. 通过改变改view的opacity来实现透明渐变. WXML <!--pages/scroll/scroll.wxml--> <view style="height:100%;position:fixed;width:100%;"> <scroll-v

  • vue使用ElementUI时导航栏默认展开功能的实现

    本文主要参考: http://element.eleme.io/#/zh-CN/component/menu 在使用elementUI的时候发现,能够展开的导航栏是不能展开的,效果这里先不演示了.可以在上边的网站上看到. 现在有这样的需求,就是说,默认的时候需要展开这些导航,就是一打开界面的时候就能够显示导航里面的菜单内容. 具体操作是这样的: <script src="//unpkg.com/vue/dist/vue.js"></script> <scr

  • 微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)

    本文实例讲述了微信小程序MUI导航栏透明渐变功能.分享给大家供大家参考,具体如下: 导航栏透明渐变效果 实现原理 1. 给page-group设置的背景颜色采用rgba; 2. 通过改变rgba其中a的值来实现透明渐变. WXML <view style="height:100%;position:fixed;width:100%;"> <scroll-view scroll-y="false" bindscroll="scroll&qu

  • 原生JS实现顶部导航栏显示按钮+搜索框功能

    根据点击导航栏,搜索框的内容会随之变动 话不多说,先上图 HTML代码段 <div class="bar"> <ul id="menu" class="menu"> <li class="active">搜店</li> <li class="gradient">地址</li> <li class="gradient&qu

  • 小程序自定义导航栏兼容适配所有机型(附完整案例)

    前言 大部分情况下我们都是使用微信官方自带的 navigationBar 配置 ,但有时候我们需要在导航栏集成搜索框.自定义背景图.返回首页按钮等. 思路 隐藏官方导航栏 获取胶囊按钮.状态栏相关数据以供后续计算 根据不同机型计算导航栏高度 编写新的导航栏 页面引用自定义导航 正文 隐藏官方导航栏 隐藏导航栏可以全局配置,也可以单独页面配置,具体根据业务需求来. 全局隐藏 //app.json "window": { "navigationStyle": "

  • Android导航栏功能项的显示与屏蔽介绍

     Android 的导航栏有诸多功能,例入 截屏,音量加,音量减,最近任务,菜单.返回,主页面,输入法开关 ...... 代码源路径:frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\NavigationBarView.java public ButtonDispatcher getScreenshotButton() { return mButtonDispatchers.get(R.id.sc

随机推荐