Ich habe benutzerdefinierte Einträge, und ich möchte wissen, wann es sich konzentrierte, aber es geschieht nie. Ich habe versucht, es in benutzerdefinierten Android-Klasse zu fangen, und in XAML-Event konzentriert, aber es hat nichts getan. Ich hatte dieses Problem auch schon, aber ich habe es nicht gelöst. Hier ist eine Klasse. Ereignisse in Kommentarblöcken.Focused oder OnFocuseChange Ereignisse werden nicht ausgelöst
using Android.Support.Design.Widget;
using Android.Text;
using Android.Views;
using Android.Views.InputMethods;
using GitRemote.CustomClasses;
using GitRemote.Droid.DependencyServices;
using GitRemote.Droid.Renderers;
using GitRemote.ViewModels;
using System.ComponentModel;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using Color = Xamarin.Forms.Color;
using TextChangedEventArgs = Android.Text.TextChangedEventArgs;
using View = Android.Views.View;
[assembly: ExportRenderer(typeof(MaterialEntry), typeof(MaterialEntryRendererDroid))]
namespace GitRemote.Droid.Renderers
{
public class MaterialEntryRendererDroid : Xamarin.Forms.Platform.Android.AppCompat.ViewRenderer<Entry, View>
{
private TextInputLayout _nativeView;
private TextInputLayout NativeView => _nativeView ?? (_nativeView = InitializeNativeView());
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged(e);
if (e.OldElement != null) return;
// MaterialEntry Render Staff
#region
var ctrl = CreateNativeControl();
SetNativeControl(ctrl);
SetText();
SetHintText();
SetBackgroundColor();
SetTextColor();
SetIsPassword();
#endregion
if (Control != null)
switch (e.NewElement.ClassId)
{
case "LoginEntry":
ViewSaver.SaveLoginView(Control);
//Element.Focused += (sender, args) =>
//{
// ViewSaver.LastView = "LoginEntry";
//};
break;
case "PasswordEntry":
SetSendButtonAction();
ViewSaver.SavePasswordView(Control);
//Element.Focused += (sender, args) =>
//{
// ViewSaver.LastView = "PasswordEntry";
//};
break;
}
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName == Entry.PlaceholderProperty.PropertyName)
{
SetHintText();
}
if (e.PropertyName == Entry.TextColorProperty.PropertyName)
{
SetTextColor();
}
if (e.PropertyName == VisualElement.BackgroundColorProperty.PropertyName)
{
SetBackgroundColor();
}
if (e.PropertyName == Entry.IsPasswordProperty.PropertyName)
{
SetIsPassword();
}
if (e.PropertyName == Entry.TextProperty.PropertyName)
{
SetText();
}
}
private void EditTextOnTextChanged(object sender, TextChangedEventArgs textChangedEventArgs)
{
Element.Text = textChangedEventArgs.Text.ToString();
NativeView.EditText.SetSelection(Element.Text.Length);
}
private void SetText()
{
NativeView.EditText.Text = Element.Text;
}
private void SetIsPassword()
{
NativeView.EditText.InputType = Element.IsPassword
? InputTypes.TextVariationPassword | InputTypes.ClassText
: InputTypes.TextVariationVisiblePassword;
}
public void SetBackgroundColor()
{
NativeView.SetBackgroundColor(Element.BackgroundColor.ToAndroid());
}
private void SetHintText()
{
NativeView.Hint = Element.Placeholder;
}
private void SetTextColor()
{
if (Element.TextColor == Color.Default)
NativeView.EditText.SetTextColor(NativeView.EditText.TextColors);
else
NativeView.EditText.SetTextColor(Element.TextColor.ToAndroid());
}
private TextInputLayout InitializeNativeView()
{
var view = FindViewById<TextInputLayout>(Resource.Id.textInputLayout);
view.EditText.TextChanged += EditTextOnTextChanged;
return view;
}
protected override View CreateNativeControl()
{
return LayoutInflater.From(Context).Inflate(Resource.Layout.TextInputLayout, null);
}
/// <summary>
/// If Action of our entry is Send than call method from Portable
/// </summary>
private void SetSendButtonAction()
{
NativeView.EditText.EditorAction += (sender, e) =>
{
if (e.ActionId == ImeAction.Send)
{
((LoginingPageViewModel)Element.BindingContext).OnLogInTapped();
}
else
e.Handled = false;
};
}
}
}
Danke für Ihren Job, was Sie getan haben, aber ich habe alles und es funktioniert. Die Frage ist eine andere. Ich möchte wissen, wann mein Custom Enrty Fokus hat und wann es es verliert. Also habe ich "Fokussiert" in xaml und andere Ereignisse wie OnFocusChange in Android-Projekten verwendet. Aber es feuert nie. Die Sache ist in diesen Zeilen: //Element.Focused + = (Absender, Args) => // { // ViewSaver.LastView = "LoginEntry"; //}; –
Zunächst ist Ihr Code sehr stinkend, Sie sollten über SOLID und OOP lesen. Wenn Sie ein anderes Ereignis auslösen möchten, wenn die IsFocused-Eigenschaft geändert wird, gehen Sie zu https://developer.xamarin.com/guides/xamarin-forms/working-with/triggers/ und überprüfen Sie den Abschnitt für die Interaktion mit Entractions. Sie können diese Tricks mit dem Code verwenden, den ich oben gesendet habe. –
Bitte antworten Sie auf Frage und sagen Sie nicht, was ich bereits weiß und andere Dinge wie "stinkend". Sie zeigten mir standart und einfache Implementierung von benutzerdefinierten Eintrag ohne etwas "Brauch" tatsächlich. Ich habe einige Dinge, was Code tut, also ist es etwas kompliziert. Also, bevor du etwas sagst, bitte versuche es herauszufinden. Es feuert nicht, bitte verstehen Sie es. –