【问题标题】:How to use setOnTouchListener in C# (Xamarin)?如何在 C# (Xamarin) 中使用 setOnTouchListener?
【发布时间】:2014-08-09 22:22:34
【问题描述】:

你能给我一个 C# 中 setOnTouchListener 的例子吗?

我试过这样,但我带来了一些错误。

Button1.setOnTouchListener(new View.OnTouchListener()
    {
        public boolean onTouch(View arg0, MotionEvent arg1)
        {
            x.Text = "1";
        }
    });

【问题讨论】:

    标签: c# android xamarin


    【解决方案1】:

    你要么。使用Touch 事件:

    button1.Touch += (s, e) =>
    {
        var handled = false;
        if (e.Event.Action == MotionEventActions.Down)
        {
            // do stuff
            handled = true;
        }
        else if (e.Event.Action == MotionEventActions.Up)
        {
            // do other stuff
            handled = true;
        }
    
        e.Handled = handled;
    };
    

    或者您可以显式实现IOnTouchListener 接口(C# 没有匿名类)。请注意,在实现 Java 接口时,您还需要从 Java.Lang.Object 继承,因为我们需要处理 Java 方面的故事(当我们使用 Touch 事件时,这显然不需要)。

    public class MyTouchListener 
        : Java.Lang.Object
        , View.IOnTouchListener
    {
        public bool OnTouch(View v, MotionEvent e)
        {
            if (e.Action == MotionEventActions.Down)
            {
                // do stuff
                return true;
            }
            if (e.Action == MotionEventActions.Up)
            {
                // do other stuff
                return true;
            }
    
            return false;
        }
    }
    

    然后设置它:

    button1.SetOnTouchListener(new MyTouchListener());
    

    注意,使用后一种方法还需要您处理对要在 OnTouchListener 类中修改的对象的引用,而 C# 事件不需要这样做。

    编辑: 附带说明一下,如果您使用Touch 事件或任何其他事件,请记住做一个好公民,并在您不再有兴趣接收该事件时解开该事件。最坏的情况是,如果忘记取消挂钩事件,则会因为无法清理实例而导致内存泄漏。

    所以在第一个例子中,不要使用匿名方法:

    button1.Touch += OnButtonTouched;
    

    记得解开它:

    button1.Touch -= OnButtonTouched;
    

    【讨论】:

    • 完美......!但我注意到这里只有少数人是大师..lol
    • @Cheesebaron 当用户触摸该视图的任何子视图时,无论如何都要记录该视图的触摸
    • @vigneshkumar 不太清楚你的意思。这可能应该是一个新的 SO 问题,有更多细节:)
    【解决方案2】:
    private Button Button1;
    
    @Override
    public void onCreate(Bundle savedInstanceState)
    {       
        super.onCreate(savedInstanceState);
    
        Button1.setOnTouchListener(new OnTouchListener()
        {
            @Override
            public boolean onTouch(View v, MotionEvent event)
            {
                if (event.getAction() == MotionEvent.ACTION_DOWN)
                {
                    //do stuff
                }
                else if (event.getAction() == MotionEvent.ACTION_UP)
                {
                    // do stuff
                }
                return false;
            }
        });
    }
    

    从您提出的另一个问题来看,我猜您需要将 onTouch 侦听器移动到 onCreate 方法中

    【讨论】:

    • 请显示错误和所有 oncreate 方法 - 编辑您的问题
    • 我已经编辑了我的答案 - 见上文。您可能正在尝试直接从 onCreate 方法外部调用 onTouc 列表器,除非您将它保存在仍然从 OnCreate 调用的另一个方法中,否则这将不起作用
    • 是的,您似乎需要如上所述移动方法,而且您已经直接复制了我的代码并使用了 Button1 我已经更新了我的代码以使用 Button1 而不是 Button
    • 检查你的 '}' 看起来你有一对多或需要在某处添加一个,如果你还在挣扎,请发布完整文件
    • 参见上面 CheeseBarron 关于继承 java 类的评论。考虑到您正在使用 Java 接口和 C# +1 @CheeseBarron,我假设您已经这样做了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 2019-11-26
    • 2018-04-07
    • 2019-11-08
    相关资源
    最近更新 更多