2017-03-20 17 views
0

私はButtonRenderを通じてアンドロイドボタンの機能を実装しようとしています。この問題は、長いクリックイベントを開始しないため、「。LongClick」と「.touch」に参加しようとすると発生します。Xamarin.Android ButtonRenderer longclick and touch

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

あなたはボタンの 'Touch'イベントをしたいですか? 'Click'イベントはあなたのために働かないのですか? – apineda

+0

私の答えを確認しましたか?何の問題? –

+0

私はそれを実装しようとしていますが、少し時間がありました。今夜私は見ることを終え、何かを伝えます。興味ありがとう! – Oshant

答えて

2

ネイティブコントロールのイベントを呼び出すために、私たちは一緒にレンダラからの値を設定するためにIViewControllerから継承するインターフェイスを私たちのカスタムコントロールにイベントハンドラを作成する必要があり、そして。 ButtonRendererIMyButtonControllerを実装し、Androidのプロジェクトに続いて

public interface IMyButtonController : IViewController 
{ 
    void SendTouched(); 

    void SendLongClicked(); 

    void SendReleased(); 
} 

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

このようなIViewControllerからIMyButtonController継承:ここ

は、まず、カスタムボタンを作成し、私のデモですこのように:

[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; 
      } 
     } 
    } 
} 
関連する問題