2017-03-20 1 views
0

Ich versuche, die Funktionalität der Android-Taste über einen ButtonRender zu implementieren. Das Problem tritt auf, wenn ich versuche, ".LongClick" und ".touch" beizutreten, da das Ereignis "Long Click" nicht gestartet wird.Xamarin.Android ButtonRenderer longclick und berühren

protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e) 
     { 

     this.SetBackgroundResource(Resource.Drawable.button); 

     base.OnElementChanged(e); 
     Android.Widget.Button thisButton = Control as Android.Widget.Button; 

     thisButton.LongClickable = true; 


     thisButton.LongClick += delegate 
     { 
      string s = ""; 
     }; 



     thisButton.Touch += (object sender, Android.Views.View.TouchEventArgs e2) => 
     { 

      if (e2.Event.Action == MotionEventActions.Down) 
      { 
       . 
       . 
       . 
      } 
      else if (e2.Event.Action == MotionEventActions.Up) 
      { 
       . 
       . 
       . 
      } 
      else if (e2.Event.Action == MotionEventActions.HoverExit || e2.Event.Action == MotionEventActions.Cancel) 
      { 
       . 
       . 
       . 
      } 
      else if (e2.Event.Action == MotionEventActions.Move) 
      { 
       . 
       . 
       . 
      } 

      }; 
    } 
+1

Sind Sie sicher, dass Sie das "Touch" -Ereignis der Schaltfläche möchten? Funktioniert das Click-Event nicht für Sie? – apineda

+0

Haben Sie meine Antwort überprüft? Irgendein Problem? –

+0

Ich versuche es zu implementieren, aber ich hatte wenig Zeit. Heute Abend sehe ich zu und ich erzähle dir etwas. Danke für das Interesse! – Oshant

Antwort

2

Um das Ereignis von nativen Kontrolle aufrufen, müssen wir Event-Handler in unserer Custom Controls und zusammen eine Schnittstelle, die erbt von IViewController zu setzen, um Werte von Renderer erstellen.

Hier ist meine Demo, zunächst, eine benutzerdefinierte Schaltfläche erstellen:

public class MyButton : Xamarin.Forms.Button, IMyButtonController 
{ 
    public event EventHandler Touched; 

    void IMyButtonController.SendTouched() 
    { 
     Touched?.Invoke(this, EventArgs.Empty); 
    } 

    public event EventHandler LongClicked; 

    void IMyButtonController.SendLongClicked() 
    { 
     LongClicked?.Invoke(this, EventArgs.Empty); 
    } 

    public event EventHandler Released; 

    void IMyButtonController.SendReleased() 
    { 
     Released?.Invoke(this, EventArgs.Empty); 
    } 
} 

Die IMyButtonController erbt von IViewController wie folgt aus:

public interface IMyButtonController : IViewController 
{ 
    void SendTouched(); 

    void SendLongClicked(); 

    void SendReleased(); 
} 

Dann in android Projekt, implementieren die ButtonRenderer und IMyButtonController wie folgt:

[assembly: ExportRenderer(typeof(MyButton), typeof(MyButtonRenderer))] 
namespace ProjectNameSpace.Droid 
{ 
    public class MyButtonRenderer : Xamarin.Forms.Platform.Android.ButtonRenderer 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e) 
     { 
      base.OnElementChanged(e); 
      if (e.NewElement != null) 
      { 
       if (Control != null) 
       { 
        Control.SetOnTouchListener(ButtonTouchListener.Instance.Value); 
        Control.LongClickable = true; 
        Control.SetOnLongClickListener(ButtonLongClickListener.Instance.Value); 
       } 
      } 
     } 

     protected override void Dispose(bool disposing) 
     { 
      if (disposing) 
      { 
       if (Control != null) 
       { 
        Control.SetOnTouchListener(null); 
        Control.SetOnLongClickListener(null); 
       } 
      } 

      base.Dispose(disposing); 
     } 

     private class ButtonTouchListener : Java.Lang.Object, Android.Views.View.IOnTouchListener 
     { 
      public static readonly Lazy<ButtonTouchListener> Instance = new Lazy<ButtonTouchListener>(() => new ButtonTouchListener()); 

      public bool OnTouch(Android.Views.View v, Android.Views.MotionEvent e) 
      { 
       var renderer = v.Tag as ButtonRenderer; 
       if (renderer != null) 
       { 
        var buttonController = renderer.Element as IMyButtonController; 
        if (e.Action == Android.Views.MotionEventActions.Down) 
        { 
         buttonController?.SendTouched(); 
        } 
        else if (e.Action == Android.Views.MotionEventActions.Up) 
        { 
         buttonController?.SendReleased(); 
        } 
       } 
       return false; 
      } 
     } 

     private class ButtonLongClickListener : Java.Lang.Object, Android.Views.View.IOnLongClickListener 
     { 
      public static readonly Lazy<ButtonLongClickListener> Instance = new Lazy<ButtonLongClickListener>(() => new ButtonLongClickListener()); 

      public bool OnLongClick(Android.Views.View v) 
      { 
       var renderer = v.Tag as ButtonRenderer; 
       ((IMyButtonController)renderer?.Element)?.SendLongClicked(); 
       return true; 
      } 
     } 
    } 
}