Как изменить значок SearchBar Xamarin Forms на Android?

Мне требуется ваша помощь !

Я работаю над проектом мобильной разработки, кроссплатформенным. Я использую Visual Studio с Xamarin Forms. Я хочу создать страницу с SearchBar (класс Xamarin.Forms), но моя проблема заключается в персонализации значка SearchBar, особенно на платформе Android. Мои поиски ни к чему не привели. Я был бы очень признателен, если бы вы знали способ редактирования значка. (У меня есть модель для подражания, поэтому я хочу изменить значок, а не цвет).

Заранее спасибо !

введите здесь описание изображения


person R.Extrant    schedule 19.04.2016    source источник


Ответы (4)


введите описание изображения здесь

Знакомство с пользовательскими модулями визуализации

Вы можете довольно легко подклассифицировать стандартные элементы управления Xamarin.Forms для внесения незначительных изменений, ориентированных на платформу, в элементы управления.

В приведенных выше примерах я создаю два подкласса SearchBar, один для разрешения пользовательского значка, а другой для удаления значка, Xamarin.Android выглядит следующим образом:

введите описание изображения здесь

protected override void OnElementChanged (ElementChangedEventArgs<SearchBar> e)
{
    base.OnElementChanged (e);
    if (Control != null) {
        var searchView = Control;
        searchView.Iconified = true;
        searchView.SetIconifiedByDefault (false);
        // (Resource.Id.search_mag_icon); is wrong / Xammie bug
        int searchIconId = Context.Resources.GetIdentifier ("android:id/search_mag_icon", null, null);
        var icon = searchView.FindViewById (searchIconId);
        (icon as ImageView).SetImageResource (Resource.Drawable.icon);
    }

введите описание изображения здесь

protected override void OnElementChanged (ElementChangedEventArgs<SearchBar> e)
{
    base.OnElementChanged (e);
    if (Control != null) {
        var searchView = Control;
        searchView.Iconified = true;
        searchView.SetIconifiedByDefault (false);
        // (Resource.Id.search_mag_icon); is wrong / Xammie bug
        int searchIconId = Context.Resources.GetIdentifier ("android:id/search_mag_icon", null, null);
        var icon = searchView.FindViewById (searchIconId);
        icon.Visibility = Android.Views.ViewStates.Gone;

    }
}
person SushiHangover    schedule 19.04.2016
comment
Привет, Сушил, я следую твоему коду, он отлично работает, но когда я начинаю вводить текст в строке поиска, он снова показывает изображение поиска. Теперь просто скройте изображение поиска в первый раз. Я хочу навсегда скрыть поисковое изображение. Как я могу этого добиться. - person Deepak; 13.10.2017
comment
@Deepak В средстве визуализации вы можете установить видимость значка, icon.Visibility = Android.Views.ViewStates.Gone; Установите его, когда элемент управления содержит текст (используйте событие или прослушиватель в средстве визуализации - person SushiHangover; 13.10.2017
comment
Спасибо Сушил, я использую метод oneelementproperychanged для скрытия изображения поиска, когда пользователь вводит текст в строке поиска, но в первый раз изображение поиска видно, когда пользователь начинает вводить текст, оно исчезнет. Я также хочу скрыть поисковое изображение в первый раз. - person Deepak; 13.10.2017
comment
@Deepak Я не уверен, что понимаю, вы хотите, чтобы значок скрывался, когда запись поиска получает фокус, но до того, как пользователь введет первый символ? - person SushiHangover; 13.10.2017
comment
yes sushil, на самом деле в первый раз я устанавливаю, что видимость панели поиска ложна, когда пользователь нажимает одну кнопку, я показываю панель поиска с фокусом. в чем моя проблема, когда пользователь нажимает кнопку, я показываю панель поиска, но с этой строкой поиска изображение поиска также видно. Я хочу скрыть это изображение поиска. когда пользователь начал вводить текст, он скроется, но я хочу скрыть, когда панель поиска видна. - person Deepak; 13.10.2017
comment
Используйте другой ответ, чтобы полностью скрыть: stackoverflow.com/a/38200193/4984832 - person SushiHangover; 13.10.2017
comment
когда я фокусирую панель поиска, когда я показываю, отображается это изображение панели поиска. Если я удалю фокус, он будет работать нормально, но я хочу сфокусировать панель поиска. - person Deepak; 13.10.2017
comment
@Deepak Извините, я не понимаю, о чем вы спрашиваете, вы хотите, чтобы значок панели поиска отображался вообще? - person SushiHangover; 13.10.2017
comment
Точно наоборот. Я хочу вообще скрыть значок панели поиска. - person Deepak; 13.10.2017
comment
Спасибо Суши, я использую приведенную выше ссылку, которую вы предложили. Это удовлетворяет мое требование. Большое спасибо. - person Deepak; 13.10.2017
comment
Невероятно... Прошло более 2 лет, а ошибка все еще существует... Использование Resource.Id.search_mag_icon не сработает - person Mikolaj Kieres; 18.08.2018

Метод @SushiHangover работает нормально, но значок появляется снова, как только SearchView получает фокус. Чтобы исправить это, я использую LayoutParameters для значка:

if(Control!= null){
    ...
    int searchIconId = Context.Resources.GetIdentifier ("android:id/search_mag_icon", null, null);
    var icon = (ImageView)searchView.FindViewById (searchIconId);
    icon.LayoutParameters = new LinearLayout.LayoutParams (0, 0);
    ...
}
person Cuckooshka    schedule 05.07.2016

         protected override void OnElementChanged(ElementChangedEventArgs<SearchBar> e)
        {
            base.OnElementChanged(e);
            if (Control != null)
            {
                var plateId = Resources.GetIdentifier("android:id/search_plate", null, null);
                var plate = Control.FindViewById(plateId);
                plate.SetBackgroundColor(Android.Graphics.Color.Transparent);

                SearchView searchView = (base.Control as SearchView);
                var searchIconId = searchView.Resources.GetIdentifier("android:id/search_map_icon", null, null);
                var searchIcon = searchView.FindViewById(searchIconId);
                searchView.SetIconifiedByDefault(false);
                searchIcon.RemoveFromParent();

                int textViewId = Resources.GetIdentifier("android:id/search_src_text", null, null);
                EditText textView = (Control.FindViewById(textViewId) as EditText);
                textView.TextAlignment = Android.Views.TextAlignment.ViewStart;
            }
        } 

Это сработало для меня

person Wimalasuriya    schedule 14.11.2017

Чтобы настроить значок SearchBar, вам нужно создать собственный рендерер, в котором вы будете настраивать виджет SearchView для Android:

[assembly:ExportRenderer(typeof(MySearchBar), typeof(Some.Namespance.MySearchBar_Droid) )]
namespace Some.Namespace
{
    public class MySearchBar_Droid : SearchBarRenderer
    {
        protected override void OnElementChanged( ElementChangedEventArgs<SearchBar> args )
        {
            base.OnElementChanged(args);    

            SearchView searchView = (base.Control as SearchView);

           //Customize SearchView here
        }
    }
}

Дополнительные сведения см. в разделе Введение в пользовательские средства визуализации.

person Giorgi    schedule 19.04.2016