android - 将 Android Java 代码转换为 Xamarin C#

标签 android xamarin xamarin.android

我在将代码从 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/

相关文章:

java - 默认情况下未选中抽屉导航项目

android - (Android) 是否有可靠的信号表明网络 channel 是可路由的?

android - 如何解析 Android 项目中属性的 "No resource identifier found"?

xaml - Xamarin(框架。)GestureRecognizers 不起作用

android - Monodroid Intent Service 的 BroadcastReceiver 没有触发 OnReceive

安卓闹钟音量逐渐增大

android - Phonegap 键盘在聚焦输入时上下滚动页面

ios - Xamarin Profiler 未显示在 Visual Studio 2017 中的“分析”选项卡下

android - 无法在android上使用C++ OpenCV打开相机

android - Xamarin.Android-安卓 :fontFamily doesn't work