2016-07-25 54 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