Android
にXamarin.Forms
アプリケーションを作成し、Xamarin.Forms
Entry
コントロールの下の線の色を変更しようとしています。
次のようなEntry
コントロールがあります。
<Entry Text="new cool street"/>
このEntry
の下の線の色を、デフォルトの白から私のテーマに合わせてより紫色に変更したいと思います。
可能であれば、Entry
を継承するすべてのコントロールに適用されるため、Android Stylesを使用して行う方が良いでしょう。
これは可能ですか?
すべてのエントリに影響するカスタムレンダラーを使用できます。
androidの場合:
[Assembly: ExportRenderer(typeof(Entry), typeof(MyEntryRenderer))]
namespace Android.MyRenderers
{
public class MyEntryRenderer : EntryRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged(e);
if (Control == null || e.NewElement == null) return;
if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
Control.BackgroundTintList = ColorStateList.ValueOf(Color.White);
else
Control.Background.SetColorFilter(Color.White, PorterDuff.Mode.SrcAtop);
}
}
}
およびiOS:
[Assembly: ExportRenderer (typeof(Entry), typeof(MyEntryRenderer))]
namespace iOS.MyRenderers
{
public class MyEntryRenderer : EntryRenderer
{
private CALayer _line;
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged (e);
_line = null;
if (Control == null || e.NewElement == null)
return;
Control.BorderStyle = UITextBorderStyle.None;
_line = new CALayer {
BorderColor = UIColor.FromRGB(174, 174, 174).CGColor,
BackgroundColor = UIColor.FromRGB(174, 174, 174).CGColor,
Frame = new CGRect (0, Frame.Height / 2, Frame.Width * 2, 1f)
};
Control.Layer.AddSublayer (_line);
}
}
}
これに関するWindowsソリューションについてはわからない
同じ問題が発生し、styles.xml(inXamarin.AndroidのcolorAccent
値を変更するだけでしたproject)は、カーソルの色とEntry
フィールドの下の境界線を変更します。
<item name="colorAccent">#BA55D3</item>
コンテンツページには1つの背景色があり、ダイアログには別の背景色があるので、スタイルを使用して下部バーの色を指定するのはまったく間違った答えです。そして、OPはAndroidについてのみ尋ねたので、これはAndroidだけです...
カスタムレンダラーを使用して、下部バーの色をテキストの色と同じに設定します。 ElementChangedとPropertyChangedの両方が必要です。
[Assembly: ExportRenderer(typeof(Xamarin.Forms.Entry), typeof(CustomEntryRenderer))]
namespace XamFormsConnect.Droid
{
public class CustomEntryRenderer : EntryRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Entry> e)
{
base.OnElementChanged(e);
if (Control != null && e.NewElement != null)
{
var entry = (Xamarin.Forms.Entry)e.NewElement;
if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
Control.BackgroundTintList = ColorStateList.ValueOf(entry.TextColor.ToAndroid());
else
Control.Background.SetColorFilter(entry.TextColor.ToAndroid(), PorterDuff.Mode.SrcAtop);
}
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName == "TextColor")
{
var entry = (Xamarin.Forms.Entry)sender;
if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
Control.BackgroundTintList = ColorStateList.ValueOf(entry.TextColor.ToAndroid());
else
Control.Background.SetColorFilter(entry.TextColor.ToAndroid(), PorterDuff.Mode.SrcAtop);
}
}
}
}
シンプル:res/values/colors.xmlを次のように編集します:#303F9F
#303F9Fの代わりに任意の16進カラーコードを配置できます
<color name="colorPrimaryDark">#303F9F</color>
使用できるもう1つの単純な視覚的ソリューションは、この行を非表示にすることです。
<Grid>
<Entry Placeholder="Your Entry"/>
<BoxView BackgroundColor="White" HeightRequest="10"/>
</Grid>
ハードコード化された色を使用する代わりに、独自のコンポーネントを作成することで改善できます。
root のiOSカスタムレンダラーで幅またはy位置が正しく動作しない場合は、解決策が見つかりました。
private CustomEntry _entry;
private double _yPos;
private double _width;
OnElementChanged
の値を割り当てます。if (e.NewElement != null)
_entry = e.NewElement as CustomEntry;
OnElementPropertyChanged
に次を含めます。if (e.PropertyName == "Width")
{
_width = _entry.Width;
}
else if (e.PropertyName == "Height")
{
_yPos = _entry.Height;
}
_line.Frame = new CGRect(0, _yPos, _width, 1f);
Xamarin Formsを使用している場合は、Mobile.Droid、リソース、値に移動し、「Your Colur」で機能します。