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

作者:痕迹g 时间:2022-01-28 18:38:58 

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

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

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

真机效果演示:

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

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

实现思路:

  • 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

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

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文件, 如下:

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

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

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

渲染器添加实现页

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

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

MainActivity初始化

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

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

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

来源:https://www.cnblogs.com/zh7791/p/12690118.html

标签:Xamarin.Forms,导航栏,搜索,功能
0
投稿

猜你喜欢

  • Android 接收微信、QQ其他应用打开第三方分享功能

    2022-06-12 18:11:58
  • Android实现简单时钟View的方法

    2022-10-21 18:36:00
  • Android 微信摇一摇功能实现详细介绍

    2023-06-21 21:00:09
  • Android Studio 常见问题及解决方法(推荐)

    2023-08-18 09:07:35
  • C# 解析 Excel 并且生成 Csv 文件代码分析

    2021-11-09 18:04:04
  • Jenkins一键打包部署SpringBoot应用的方法步骤

    2021-10-31 18:00:53
  • c# 通过wbemtest和WMI Code Cretor更加高效的访问WMI

    2022-11-17 16:30:16
  • tk.mybatis如何扩展自己的通用mapper

    2022-02-16 04:10:17
  • Android onbackpressed实现返回键的拦截和弹窗流程分析

    2021-09-11 09:07:22
  • 使用Java实现Redis限流的方法

    2023-09-27 01:43:47
  • Android三种GSM手机定位技术分析

    2023-04-10 10:09:22
  • SpringMVC接收复杂集合对象(参数)代码示例

    2023-01-29 18:33:51
  • Struts2拦截器 关于解决登录的问题

    2023-07-02 14:06:09
  • Java 多用户登录限制的实现方法

    2022-04-06 07:32:46
  • 常见Android编译优化问题梳理总结

    2021-08-17 11:21:48
  • startActivityForResult和setResult案例详解

    2023-09-15 19:13:33
  • android动态设置app当前运行语言的方法

    2022-02-21 01:33:37
  • 关于C++中菱形继承和虚继承的问题总结

    2021-10-03 20:22:23
  • Springboot+Netty+Websocket实现消息推送实例

    2022-03-24 09:29:29
  • 详解C语言内核字符串拷贝与比较

    2023-11-02 15:22:30
  • asp之家 软件编程 m.aspxhome.com