我在StackLayout上有一个深色背景颜色的Xamarin.Forms SearchBar。
默认情况下,输入字段也是暗的,可能是由于透明背景。要修改搜索栏背景颜色,可以使用BackgroundColor
属性。 (在下面的示例中,我将其设置为深灰色。)
但如何调整文字颜色?没有这样的财产。即使使用自定义搜索栏渲染器,我也找不到解决方案。
这就是占位符的外观:
...还有一些输入(黑色的“Hello world!”在非常黑暗的背景上):
答案 0 :(得分:5)
以下是Android自定义渲染器的代码,可以解决这个问题。我会上传截图,但我还没有足够的分数:(
using System;
using Android.Widget;
using Android.Text;
using G = Android.Graphics;
using Xamarin.Forms;
using Xamarin.Forms.Platform.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 );
// Get native control (background set in shared code, but can use SetBackgroundColor here)
SearchView searchView = (base.Control as SearchView);
searchView.SetInputType( InputTypes.ClassText | InputTypes.TextVariationNormal );
// Access search textview within control
int textViewId = searchView.Context.Resources.GetIdentifier( "android:id/search_src_text", null, null );
EditText textView = (searchView.FindViewById( textViewId ) as EditText);
// Set custom colors
textView.SetBackgroundColor( G.Color.Rgb( 225, 225, 225 ) );
textView.SetTextColor( G.Color.Rgb( 32, 32, 32 ) );
textView.SetHintTextColor( G.Color.Rgb( 128, 128, 128 ) );
// Customize frame color
int frameId = searchView.Context.Resources.GetIdentifier( "android:id/search_plate", null, null );
Android.Views.View frameView = (searchView.FindViewById( frameId ) as Android.Views.View);
frameView.SetBackgroundColor( G.Color.Rgb( 96, 96, 96 ) );
}
}
}
答案 1 :(得分:1)
您可以通过创建具有可绑定属性的自定义视图(如 ForegroundTextColor )来实现此目的,然后创建自定义渲染器。
在自定义渲染器中,您可以从特定于平台的渲染器继承,即在 WindowsPhone 上,它是: -
<强> Xamarin.Forms.Platform.WinPhone.SearchBarRenderer 强>
然后,您可以监控对您创建的 bindable-property 的属性更改,并设置使用的平台本机控件 文本颜色更改 SearchBar 的非编辑视图的外观。
您还必须监控 IsFocused 并至少在 WindowsPhone 上应用着色。这也可能适用于其他平台。
更新1: -
<强> ====== 强>
在回复您的评论时,您不必自己呈现整个 SearchBar 。
如果您继承了渲染器,则可以更精细地自定义内容。
具体参考 Android 来实现此目的,您必须参考 AutoCompleteTextView ,然后您可以调用 SetTextColor 来更改颜色。
更新2: -
<强> ========== 强>
SearchBar 是 Android 中的复合控件。
AutoCompleteTextView 深埋在层次结构中。
在 4.4 上,可以使用以下代码找到它。其他版本可能会有所不同。然而,这绝不是使用序数索引生产的好方法: -
AutoCompleteTextView objAutoTextView = (AutoCompleteTextView)(((this.Control.GetChildAt(0) as ViewGroup).GetChildAt(2) as ViewGroup).GetChildAt(1) as ViewGroup).GetChildAt(0);
此是渲染器类。
然后,您可以使用颜色调用 objAutoTextView.SetTextColor ,以实现 SearchBar 前景文本的颜色更改。
答案 2 :(得分:1)
如果您使用xaml在不同平台上获取搜索栏的不同文本颜色,则可以在xaml中进行以下更改:
<SearchBar x:Name="Search"
Placeholder="Search"
TextChanged="SearchBar_OnTextChanged"
SearchButtonPressed="OnSearch" BackgroundColor="#19588F">
<SearchBar.TextColor>
<OnPlatform x:TypeArguments="Color">
<OnPlatform.iOS>
Black
</OnPlatform.iOS>
<OnPlatform.Android>
White
</OnPlatform.Android>
<OnPlatform.WinPhone>
White
</OnPlatform.WinPhone>
</OnPlatform>
</SearchBar.TextColor>
</SearchBar>
答案 3 :(得分:0)
我终于找到了一个非常简单的解决方案:
我不小心使用了Android主题@android:style/Theme.Holo.Light
并明确修改了所有颜色。但要在搜索栏上获得明亮的文字颜色,最好使用@android:style/Theme.Holo
。
它不允许您非常精确地设置颜色,但在这种情况下我只需要将其从黑色更改为白色。
答案 4 :(得分:0)
这是我如何做到的,另一种方式:
[assembly: ExportRenderer(typeof (CustomSearchBar), typeof (CustomSearchBarRenderer))]
namespace Bahai.Android.Renderers
{
public class CustomSearchBarRenderer : SearchBarRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<SearchBar> e)
{
base.OnElementChanged(e);
if (e.OldElement == null)
{
SearchBar element = (SearchBar) this.Element;
var native = (global::Android.Widget.SearchView) Control;
// do whatever you want to the controls here!
//--------------------------------------------
// element.BackgroundColor = Color.Transparent;
// native.SetBackgroundColor(element.BackgroundColor.ToAndroid());
// native.SetBackgroundColor(Color.White.ToAndroid());
//The text color of the SearchBar / SearchView
AutoCompleteTextView textField = (AutoCompleteTextView)
(((Control.GetChildAt(0) as ViewGroup)
.GetChildAt(2) as ViewGroup)
.GetChildAt(1) as ViewGroup)
.GetChildAt(0);
if (textField != null)
textField.SetTextColor(Color.White.ToAndroid());
}
}
}
}