我在将代码从 native Android JAVA 代码转换为 Xamarin C# Android 代码时遇到问题
我有一个类可以帮助我延迟开始自定义 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)
mHandler.sendMessageDelayed(mHandler.obtainMessage(MESSAGE_TEXT_CHANGED, text), mAutoCompleteDelay);
Java I 上的原始代码 copied from github
请帮我转换。 抱歉我的英语不好)
最佳答案
第一个错误的发生是因为与 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 等效项, sendMessageDelayed
, obtainMessage
只是RemoveMessages
, SendMessageDelayed
, ObtainMessage
, 在 PascalCase
之后Microsoft C# 编码风格指南概述的方法命名约定。 所有 Xamarin 基类库和为 Java 库生成的绑定(bind)都遵循此约定。
我还建议您将字段名称从 mSomeField
更改为至 someField
遵循 MS C# 编码风格指南。
关于android - 将 Android Java 代码转换为 Xamarin C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38576999/