Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Xamarin中视图的SetListener_Java_C#_Android_Xamarin_Xamarin.android - Fatal编程技术网

Java Xamarin中视图的SetListener

Java Xamarin中视图的SetListener,java,c#,android,xamarin,xamarin.android,Java,C#,Android,Xamarin,Xamarin.android,我正在尝试将一些Java代码移植到C#。其中CW是一个扩展视图的类OnSelectedListener是一个带有Cselectedas方法的接口,该方法采用int参数 setListener是类中的一个方法。问题在于实例化Java中的接口 private View selectedView = new View( context ); CW.setListener( new OnSelectedListener() { @Override public void

我正在尝试将一些Java代码移植到C#。其中CW是一个扩展视图的类
OnSelectedListener
是一个带有
Cselected
as方法的接口,该方法采用
int
参数

setListener是类中的一个方法。问题在于实例化Java中的接口

private View selectedView = new View( context );

        CW.setListener( new OnSelectedListener() {
    @Override
    public void cSelected(Integer color) {
    selectedColor = color;
    selectedView.setBackgroundColor( color );
    }
    });
使用相同方法的另一个实现

VS.setListener( new OnSelectedListener() {
public void cSelected(Integer color) {
VS.setColor( color, true );
}
} );
有人能帮我把上面的代码移植到C#吗?感谢您的帮助。我正在使用Xamarin开发Android应用程序

编辑:

这是完整的CW课程

 public class HSVColorWheel : View
        {
            private const float SCALE = 2f;
            private const float FADE_OUT_FRACTION = 0.03f;
            private const int POINTER_LINE_WIDTH_DP = 2;
            private const int POINTER_LENGTH_DP = 10;

            private Context _context;

            public HSVColorWheel(Context context, IAttributeSet attrs, int defStyle)
                : base(context, attrs, defStyle)
            {
                this._context = context;
                Init();
            }

            public HSVColorWheel(Context context, IAttributeSet attrs) : base(context, attrs)
            {

                this._context = context;
                Init();
            }

            public HSVColorWheel(Context context) : base(context)
            {
                this._context = context;
                Init();
            }

            private int scale;
            private int pointerLength;
            private int innerPadding;
            private Paint pointerPaint = new Paint();

            private void Init()
            {
                float density = _context.Resources.DisplayMetrics.Density;
                scale = (int) (density*SCALE);
                pointerLength = (int) (density*POINTER_LENGTH_DP);
                pointerPaint.StrokeWidth = (int) (density*POINTER_LINE_WIDTH_DP);
                innerPadding = pointerLength/2;
            }

            public void setListener(OnSelectedListener listener)
            {
                _listener = listener;
            }

            private float[] colorHsv = {0f, 0f, 1f};

            public void setColor(Color color)
            {

                Color.ColorToHSV(color, colorHsv);
                Invalidate();
            }
}
接口:

public interface OnSelectedListener {

void cSelected( Integer color );
}

正如评论中提到的,由于C#已经提供了一种比java的“偶数侦听器”方法更干净的方法

因此,所有基于侦听器的java代码都应该在C#中转换为适当的事件

在本例中,您似乎正在引发一个具有
int
参数的事件。这是用C#这样说的:

从“消费者”或“监听器”方面,您只需处理事件:

//In an Activity
var CW = new CW(this);

CW.SelectionChanged += CW_SelectionChanged;
其中,
CW_SelectionChanged
可以是匿名方法、实际命名方法,甚至是lambda表达式:

CW.SelectionChanged += (sender, intValue) => //[here you do something with intValue]

// -- OR --

CW.SelectionChanged += this.CW_SelectionChanged;

// then
private void CW_SelectionChanged(object sender, int intValue)
{
   //[here you do something with intValue]
}

这样,您就不需要声明额外的、不必要的1方法接口。

java中“监听器”的概念(这是一种可怕的黑客行为,旨在迎合语言的缺陷)在C#中被翻译为正确的。在C#中不需要“Listener”类,因为有内置的、语言级别的事件支持。CW是什么类型的视图?像在like Andriod中一样的视图。视图公共类CW:view{}这里缺少一块拼图。在
视图
中没有选择的
事件。CW类必须具有声明事件或其他内容的其他代码。把密码贴出来。否则,视图类中有几个与输入相关的
SetXXXListener
事件,但我不确定这是您要查找的。抱歉,setlistener是一个带有CW类的方法,其accept接口为arguemnt。public void setListener(OnSelectedListener listener)和setListener()被多次实例化。VS.setListener(新的OnSelectedListener(){public void cSelected(整数颜色){VS.setColor(颜色,真);}});{u listener=listener;},如上所述,它应该被C#中的事件替换。发布CW类的完整代码,我可能会帮助您将其转换为正确的C#/Xamarin。
//In an Activity
var CW = new CW(this);

CW.SelectionChanged += CW_SelectionChanged;
CW.SelectionChanged += (sender, intValue) => //[here you do something with intValue]

// -- OR --

CW.SelectionChanged += this.CW_SelectionChanged;

// then
private void CW_SelectionChanged(object sender, int intValue)
{
   //[here you do something with intValue]
}