2016-07-25 56 views
2

我得到一个问题,从原生的Android JAVA代码转换代码Xamarin C#的Android代码转换Android的Java代码来Xamarin C#

我有一类要帮我延时启动在我的自定义AutoComleteTextView搜索:

public class DelayAutoCompleteTextView : AutoCompleteTextView 
{ 
    public static Context _Context {get; set;} 
    private static Android.Util.IAttributeSet _Attrs { get; set; } 

public DelayAutoCompleteTextView(Context context, Android.Util.IAttributeSet attrs) : base(context, attrs) 
{ 
    _Context = context; 
    _Attrs = attrs; 
} 

private static int MESSAGE_TEXT_CHANGED = 100; 
private static int DEFAULT_AUTOCOMPLETE_DELAY = 750; 

private int mAutoCompleteDelay = DEFAULT_AUTOCOMPLETE_DELAY; 
private ProgressBar mLoadingIndicator; 

public class mHandler : Handler 
{ 
    public override void HandleMessage(Message msg) 
    { 
     DelayAutoCompleteTextView.base.PerformFiltering((Java.Lang.ICharSequence)msg.Obj, msg.Arg1); 
    } 
} 

public void setLoadingIndicator(ProgressBar progressBar) 
{ 
    mLoadingIndicator = progressBar; 
} 

public void setAutoCompleteDelay(int autoCompleteDelay) 
{ 
    mAutoCompleteDelay = autoCompleteDelay; 
} 

protected override void PerformFiltering(Java.Lang.ICharSequence text, int keyCode) 
{ 
    if (mLoadingIndicator != null) 
    { 
     mLoadingIndicator.Visibility = ViewStates.Visible; 
    } 

    mHandler.removeMessages(MESSAGE_TEXT_CHANGED); 
    mHandler.sendMessageDelayed(mHandler.obtainMessage(MESSAGE_TEXT_CHANGED, text), mAutoCompleteDelay); 
} 

public override void OnFilterComplete(int count) 
{ 
    if (mLoadingIndicator != null) 
    { 
     mLoadingIndicator.Visibility = ViewStates.Gone; 
    } 

    base.OnFilterComplete(count); 
}} 

但有3个错误消息:

  • 1)DelayAutoCompleteTextView.base.PerformFiltering((Java.Lang.ICharSequence)msg.Obj, msg.Arg1);

  • 2)mHandler.removeMessages(MESSAGE_TEXT_CHANGED);

  • 3)关于Java我mHandler.sendMessageDelayed(mHandler.obtainMessage(MESSAGE_TEXT_CHANGED, text), mAutoCompleteDelay);

原始代码copied from github

请帮我转换。 对不起,我英文不好)

回答

1

的第一个错误是因为Java不同,嵌套类在C#中不能因为他们是一个独立的实体来访问父类的this指针。

而不是使mHandler一类的,我建议你把它的变量,并使用Handler(Action<Message>)构造函数来创建Handler可以访问的DelayAutoCompleteTextView成员。

private readonly Handler mHandler = new Handler(delegate (Message msg) { 
    base.PerformFiltering((Java.Lang.ICharSequence)msg.Obj, msg.Arg1); 
}); 

第二个和第三个错误是简单的拼写错误。

removeMessages的Xamarin当量,sendMessageDelayedobtainMessage只是RemoveMessagesSendMessageDelayedObtainMessage,继微软C#编程风格指南中列出的PascalCase方法命名约定。 所有Xamarin基类库和生成Java库绑定遵守这个约定。

我还建议您根据MS C#编码风格指南将字段名称从mSomeField更改为someField

+0

谢谢你的回答,但我仍然有一个错误,因为我没有进入基地(AutoCompleteTextView)类 私人只读处理器mHandler =新的处理程序(委托(信息MSG){ base.PerformFiltering( (Java.Lang.ICharSequence)msg.Obj,msg.Arg1); }); 这个类在github https://github.com/luckychel/DanfossFindAnalogs/blob/master/DelayAutoCompleteTextView.cs 2其他错误已经走了,谢谢! – Luckychel

+0

@Luckychel尝试委托移动到方法,即移动委托的内容为'私人无效OnHandlerMessage(消息MSG)'和改变'mHandler'初始化为'新处理程序(OnHandlerMessage)'。 – EvilTak

+0

非常感谢!你拯救我的一天! – Luckychel