為Xamarin.Forms的導(dǎo)航欄增加搜索功能
在使用NavigationPage導(dǎo)航的時(shí)候, 我們可以給里面添加一些功能按鈕, 如下所示:
<ContentPage.ToolbarItems> <ToolbarItem/> <ToolbarItem/> </ContentPage.ToolbarItems>
但是如果需要給這個(gè)控件添加一些其他的控件的時(shí)候, 則無(wú)法滿足我們的需求, 這個(gè)時(shí)候, 我們就需要使用 頁(yè)面渲染器(Page Renderer)。
真機(jī)效果演示:
實(shí)現(xiàn)思路:
- 1.添加用于搜索通知的接口 : ISearchPage
- 2.自定義搜索的渲染器 : SearchPageRender
- 3.添加Menu/Item Xml文件: mainmenu.xml
- 4.添加 Nuget:Plugin.CurrentActivity
- 5.給需要添加搜索功能的頁(yè)面實(shí)現(xiàn) (1)的接口
- 6.為自定義搜索渲染器添加支持該功能的頁(yè)面
- 7.啟動(dòng)項(xiàng)初始化 : CrossCurrentActivity.Current.Init(this, savedInstanceState)
添加搜索通知接口
public interface ISearchPage { void OnSearchBarTextChanged(string text); }
自定義渲染器
在Android項(xiàng)目中創(chuàng)建 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); }
添加X(jué)ml文件引用SearchView
創(chuàng)建mainmenu.xml
在Android的Resources文件夾中, 創(chuàng)建menu文件夾創(chuàng)建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項(xiàng)目中, 添加NuGet包: Plugin.CurrentActivity , 并且在SearchPageRender 中引用它。
頁(yè)面實(shí)現(xiàn)接口 ISearchPage
渲染器添加實(shí)現(xiàn)頁(yè)
如下圖所示, 第一個(gè)typeof 指向的就是實(shí)現(xiàn)搜索內(nèi)容頁(yè)的Page
MainActivity初始化
在MainActivity的 OnCreate 中, 添加初始化的代碼, 如下:
以上步驟完整之后, 通過(guò)導(dǎo)航頁(yè)打開的頁(yè)面即可自帶搜索功能。
到此這篇關(guān)于為Xamarin.Forms的導(dǎo)航欄增加搜索功能的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C#對(duì)Xamarin框架進(jìn)行數(shù)據(jù)綁定
- .NET?Core、Xamarin、.NET?Standard和.NET?Framework四者之間的區(qū)別介紹
- C# Xamarin利用ZXing.Net.Mobile進(jìn)行掃碼的方法
- 詳解Xamarin.Android 利用Fragment實(shí)現(xiàn)底部菜單
- 詳解xamarin Android 實(shí)現(xiàn)ListView萬(wàn)能適配器
- Android將Xamarin For VS升級(jí)為4.1.0.530版教程
- c#使用xamarin編寫撥打電話程序
- Xamarin.Forms在安卓機(jī)上進(jìn)行本機(jī)調(diào)試
相關(guān)文章
將Qt項(xiàng)目升級(jí)到Qt6吐血經(jīng)驗(yàn)總結(jié)
很多朋友向小編反饋將Qt項(xiàng)目升級(jí)到Qt6頻繁出錯(cuò),該如何處理呢,今天小編給大家?guī)?lái)了將Qt項(xiàng)目升級(jí)到Qt6吐血經(jīng)驗(yàn)總結(jié),感興趣的朋友一起看看吧2021-07-07C#使用CancellationTokenSource 取消 Task的方法
因?yàn)樯婕暗搅巳粘=?jīng)常會(huì)碰到的取消任務(wù)操作,本文主要介紹了C#使用CancellationTokenSource 取消 Task,文中通過(guò)代碼介紹的非常詳細(xì),感興趣的可以了解一下2022-02-02淺談C#中的for循環(huán)與foreach循環(huán)
本篇文章主要介紹了C#中的for循環(huán)與foreach循環(huán)的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-05-05C#中的char、string和StringBuilder的使用詳解
這篇文章主要介紹了C#中的char、string和StringBuilder的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07