Xamarin - 删除 Android 中的 SearchBar 下划线

Xamarin - Remove SearchBar Underline in Android

我正在尝试删除 Android 上 SearchBar 控件下的黑色下划线。我写了一个 CustomRender,我认为它可以完成这个,但运气不好:

[assembly: ExportRenderer(typeof(NoUnderlineSearchBar), typeof(NoUnderlineSearchBarRenderer))]
namespace XamarinDemo.Droid.CustomRenderers
{
    public class NoUnderlineSearchBarRenderer : SearchBarRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<SearchBar> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {
                this.Control.SetBackgroundColor(Android.Graphics.Color.Argb(0, 0, 0, 0));
            }
        }
    }
}

这似乎适用于 Entry 字段,但不适用于 SearchBars。有谁知道如何删除自定义渲染器中的 SearchBar 下划线?谢谢!

您创建自定义渲染器是正确的,但是在您的渲染器中,要删除下划线,我们需要先在原生 android 中找到 SearchView 的盘子。例如,您可以这样编写代码:

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);
    }
}

这是对@Grace 上面的答案的扩展。

在其他示例中,我遇到了以下代码段:

protected override void OnElementChanged(ElementChangedEventArgs<SearchBar> e)
{
    base.OnElementChanged(e);

    if (Control != null)
    {
       LinearLayout linearLayout = this.Control.GetChildAt(0) as LinearLayout;
       linearLayout = linearLayout.GetChildAt(2) as LinearLayout;
       linearLayout = linearLayout.GetChildAt(1) as LinearLayout;

       linearLayout.Background = null; //removes underline
    }
}

但是,Android Lolipop 及以下 linearLayout.Background = null; 将导致

Attempt to invoke virtual method 'boolean android.graphics.drawable.Drawable.setState(int[])' on a null object reference xamarin search bar

因此,我会用 Grace 的回答替换上面的代码,如下所示:

if (Control != null)
{
    var plateId = Resources.GetIdentifier("android:id/search_plate", null, null);
    var plate = Control.FindViewById(plateId);
    plate.SetBackgroundColor(Android.Graphics.Color.Transparent);
}