Java Xamarin中视图的SetListener
我正在尝试将一些Java代码移植到C#。其中CW是一个扩展视图的类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
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]
}