Xamarin.Forms SearchBar的TextColor

时间:2014-09-02 14:53:42

标签: android xamarin xamarin.forms searchbar custom-renderer

我在StackLayout上有一个深色背景颜色的Xamarin.Forms SearchBar。

默认情况下,输入字段也是暗的,可能是由于透明背景。要修改搜索栏背景颜色,可以使用BackgroundColor属性。 (在下面的示例中,我将其设置为深灰色。)

但如何调整文字颜色?没有这样的财产。即使使用自定义搜索栏渲染器,我也找不到解决方案。

这就是占位符的外观:

...还有一些输入(黑色的“Hello world!”在非常黑暗的背景上):

5 个答案:

答案 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());
        }
    }
   }
}