網站首頁 編程語言 正文
在使用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 中, 添加初始化的代碼, 如下:
以上步驟完整之后, 通過導航頁打開的頁面即可自帶搜索功能。
原文鏈接:https://www.cnblogs.com/zh7791/p/12690118.html
- 上一篇:C#實現簡單的計算器小功能_C#教程
- 下一篇:Blazor框架簡介_基礎應用
相關推薦
- 2023-04-18 Python中selenium獲取token的方法_python
- 2022-10-11 Laravel 不添加配置文件實現 Redis 切換庫和設置 key 前綴
- 2022-06-02 C++超詳細講解單鏈表的實現_C 語言
- 2022-12-21 Input系統之InputReader處理按鍵事件詳解_Android
- 2023-06-04 pandas.DataFrame中提取特定類型dtype的列_python
- 2023-10-16 element組件autofocus( 自動獲取焦點)失效
- 2022-07-11 Python字節碼與程序執行過程詳解_python
- 2022-04-10 用python實現文件備份_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支