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);
}
我正在尝试删除 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);
}