【问题标题】:Java/ Android Studio equivalent of C# / Xamarin 'public event Action varName'Java/Android Studio 等效于 C#/Xamarin 'public event Action varName'
【发布时间】:2017-01-03 22:38:50
【问题描述】:

我被要求将代码从 Xamarin 移植到 Android Studio(C# 到 java),我正在努力移植几件事,其中包括“公共事件 Action varName1”及其对 java 的实现。开

Xamarin 的用法如下:

public class class1: Java.Lang.Object{

public event Action varName1;
public event Action varName2;
...

//and they are called as 

varName1();
varName2();
//on the public void OnMove(MotionEvent motionEvent) method.

}

它们也用于

class2:Activity{
void initialization()
  {
        class1 listener = new class1();

    listener.varName1 += class3.Open;
    listener.varName2 += class3.Close;
...
}

所以我假设每个都可以分解为两个需求,一个事件和一个不带参数的动作。由于 Action 来自 System,而且据我所知没有直接端口,因此我想到了使用在 http://codingbytodesign.net/en/2016/06/06/actiont-and-funct-tresult-in-java-8/ 找到的代码。

我还阅读了有关事件以及如何在 java 中使用它们并发现这很有帮助 (https://scatteredcode.wordpress.com/2011/11/24/from-c-to-java-events/),但是当我试图解决这两件事时,我什至不知道从哪里开始。

我相信我可能把事情复杂化了,所以我很想得到一些指导,或者如果有人可以帮助我举例说明如何解决这个问题,我将不胜感激。

【问题讨论】:

    标签: java c# android android-studio xamarin


    【解决方案1】:

    我认为没有直接的翻译。 Java通常做的是实现Listener Interfaces,也就是简单的回调。

    所以你的例子可以写成这样:

    public interface MyListener {
       public void action1();
       public void action2();
    }
    

    然后你的类可以有一个构造函数,它把这个接口作为参数并在以后调用它:

    public class ListenerConsumer {
        MyListener listener;
        ListenerConsumer (MyListener listener) {
            this.listener = listener;
        }
    
        public void doSomething() {
            this.listener.action1();
        }
    
        public void doSomethingElse() {
            this.listener.action2();
        }
    }
    

    然后您可以在构造ListenerConsumer 时匿名实现MyListener 类,例如:

    ListenerConsumer derp = new ListenerConsumer(new MyListener() {
        @Override
        public void action1() {
            Toast.makeText(getContext(), "Hello action1", Toast.LENGTH_LONG).show();
        }
    
        @Override
        public void action1() {
            Toast.makeText(getContext(), "Hello action2", Toast.LENGTH_LONG).show();
        }
    });
    

    【讨论】:

    • 感谢 Cheesebaron 的回答。我想我或多或少能理解你在说什么。但是要将 action1() 和 action2() (或引用)分配给另一个方法,例如 ' listener.action1() += class3.Open(); ' , 可能吗 ?还是应该在'@Override action1() 中调用该方法?
    • 你可以在被覆盖的 action1() 中调用它。
    • 感谢您的帮助 Cheesebaron!另一个问题,如果在 c# 中我通过 obj.event+= handler 订阅了一个事件;其中“事件”是事件 Action 而“处理程序”是 void handler(int index),有没有办法在 java 中订阅事件的方法?或者我应该在需要的地方调用事件?
    • Java 没有事件。只是回调或如上所示的侦听器,它们是您实现的接口...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多