2016-08-03 20 views
0

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; 
     }; 
    } 


} 
} 

Antwort

0

I verwendet:

private void EditTextOnFocusChanged(object sender, FocusChangeEventArgs focusChangedEventArgs) 
    { 
     if (focusChangedEventArgs.HasFocus) 
      ViewSaver.SetLastView(Element.ClassId); 
    } 


view.EditText.FocusChange += EditTextOnFocusChanged; 

und es funktioniert.

0

Ich sehe, was Sie erreichen wollen, wenn Ich bin richtig Sie versuchen, in Xamarin.Forms eine Google-Material-Design wie Eintrag zu erreichen. Werfen wir einen Blick auf einen anderen Ansatz;

Schritt 1: eine Klasse in PCL-Projekt erstellen

public class CustomEntry : Entry 
    { 

    } 

Schritt 2: eine Steuervorlage in App.xaml erstellen

<ControlTemplate x:Key="MyControlTemplate"> 
    <Grid> 
     <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="Auto"/> 
     </Grid.RowDefinitions> 
     <controls:CustomEntry x:Name="myEntry" Text="{TemplateBinding Text, Mode=TwoWay}" HorizontalOptions="FillAndExpand" HorizontalTextAlignment="Start" IsPassword="{TemplateBinding IsPassword}" MinimumHeightRequest="25"/> 
     <BoxView Grid.Row="1" BackgroundColor="#D2D2D2" HeightRequest="1" HorizontalOptions="FillAndExpand" VerticalOptions="Start"> 
     <BoxView.Triggers> 
      <DataTrigger TargetType="BoxView" Binding="{Binding Source={x:Reference myEntry}, Path=IsFocused}" Value="true"> 
      <Setter Property="BackgroundColor" Value="Black" /> 
      <Setter Property="HeightRequest" Value="2"/> 
      </DataTrigger> 
     </BoxView.Triggers> 
     </BoxView> 
    </Grid> 
    </ControlTemplate> 

Schritt 3: Erstellen Sie eine Super-Material-Design Einstiegsklasse

public class MyMaterialDesignEntry : ContentView, INotifyPropertyChanged 
    { 
     public static readonly BindableProperty TextProperty = 
     BindableProperty.Create("Text", typeof(string), typeof(ContentPage), ""); 
     public static readonly BindableProperty IsPasswordProperty = 
     BindableProperty.Create("IsPassword", typeof(bool), typeof(ContentPage), false); 

     public string Text 
     { 
      get { return (string)GetValue(TextProperty); } 
      set { SetValue(TextProperty, (string)value); } 
     }  

     public bool IsPassword => (bool)GetValue(IsPasswordProperty); 

     public MyMaterialDesignEntry() 
     { 
      ControlTemplate = (ControlTemplate)Application.Current.Resources.FirstOrDefault(x => x.Key == "MyControlTemplate").Value; 
     }  
    } 

Schritt 4: Verwenden Sie Ihren Super-Material-Design-Eintrag in XAML

<StackLayout Orientation="Vertical" HorizontalOptions="FillAndExpand"> 
      <Label Text="Login"/> 
      <controls:MyMaterialDesignEntry Text="{Binding Login, Mode=TwoWay}"/> 
      </StackLayout> 

Vergessen Sie nicht, Ihrer Seite xaml entsprechende Namespaces hinzuzufügen. Es wird dir sowieso sagen.

Viel Glück an euch alle: D

+0

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"; //}; –

+0

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. –

+0

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. –