/////////////////////////////////////////////////////////////////////// /// Xamarin Project /////////////////////////////////////////////////////////////////////// // ISearchPage.cs public interface ISearchPage { void OnSearchBarTextChanged(in string text); event EventHandler SearchBarTextChanged; } // ItemPage.xaml.cs [XamlCompilation(XamlCompilationOptions.Compile)] public partial class ItemPageList : ContentPage, ISearchPage { readonly WeakEventManager _searchTextChangedEventManager = new WeakEventManager(); public ItemPageList() { InitializeComponent(); //ToolbarItem sortBy = new ToolbarItem //{ // Text = "Sort By", // Order = ToolbarItemOrder.Secondary, // Priority = 2, // Command = viewModel.GetCommand("SortBy"), //}; //ToolbarItems.Add(sortBy); } // This invokes OnElementChanged(ElementChangedEventArgs e) in Xennon.Droid.CustomRenderer void ISearchPage.OnSearchBarTextChanged(in string text) => _searchTextChangedEventManager.RaiseEvent(this, text, nameof(SearchBarTextChanged)); } /////////////////////////////////////////////////////////////////////// /// Android Project /////////////////////////////////////////////////////////////////////// // The following is in the Android project under folder Resources/menu/MainMenu.xml // SearchPageRenderer.cs [assembly: ExportRenderer(typeof(ItemPageList), typeof(SearchPageRenderer))] namespace Xennon.Droid.CustomRenderers { public class SearchPageRenderer : PageRenderer { public SearchPageRenderer(Context context) : base(context) { } //Add the Searchbar once Xamarin.Forms creates the Page protected override void OnElementChanged(ElementChangedEventArgs e) { base.OnElementChanged(e); if (e.NewElement is ISearchPage && e.NewElement is Page page && page is ISearchPage) { AddSearchToToolbar(page.Title); } } // All if's here check out. toolBar.InflateMenu(Resource.Menu.MainMenu) does not add the search icon to the toolbar as it should void AddSearchToToolbar(string pageTitle) { if (GetToolbar() is Toolbar toolBar && toolBar.Menu?.FindItem(Resource.Id.ActionSearch)?.ActionView?.JavaCast()?.GetType() != typeof(SearchView)) { toolBar.Title = pageTitle; toolBar.InflateMenu(Resource.Menu.MainMenu); if (toolBar.Menu?.FindItem(Resource.Id.ActionSearch)?.ActionView?.JavaCast() is SearchView searchView) { searchView.QueryTextChange += HandleQueryTextChange; searchView.ImeOptions = (int)ImeAction.Search; searchView.InputType = (int)InputTypes.TextVariationFilter; searchView.MaxWidth = int.MaxValue; //Set to full width - http://stackoverflow.com/questions/31456102/searchview-doesnt-expand-full-width } } } } }