无法转换'Android.Widget.Button'类型的实例

时间:2016-07-29 12:58:26

标签: c# android xamarin xamarin.android

我有一个奇怪的例外,它在Android上工作了1年 当我这样做时:

TimerButton btnOut = FindViewById<TimerButton>(Resource.Id.btnTimer); 
它引发了一个像我这样的例外:

  

System.InvalidCastException:无法将“Android.Widget.Button”类型的实例转换为“MyProject.TimerButton”类型

奇怪的部分TimerButton是否继承自Android.Widget.Button? 像:

public class TimerButton : Android.Widget.Button
{
        public int MaxTicks { get; set; }
        public EventHandler AfterTimer;
        private String OldButtonText { get; set; }

        public ButtonState State
        {
            get { return this._state; }
        }


    protected void Initialize()
    {
        if (MaxTicks == 0)
        { MaxTicks = 10; }

        OldButtonText = this.Text;

        this.Click += (sender, e) =>
        {
            if (this._state == GSDButtonState.Normal)
            {
                this.SetState(GSDButtonState.Ticking);
            }
            else
            {
                this.SetState(GSDButtonState.Normal);
            }
        };
    }

        public TimerButton(IntPtr javaReference, Android.Runtime.JniHandleOwnership transfer ) : base (javaReference, transfer)
        {
            this.Initialize ();
        }
        public TimerButton(Context context, Android.Util.IAttributeSet attrs) : base (context, attrs)
        {
            this.Initialize ();
        }

        public TimerButton (Context context, Android.Util.IAttributeSet attrs, int defStyle) : base (context, attrs, defStyle)
        {
            this.Initialize ();
        }
}

它只是一个简短的例子,因为我使用这个按钮和自定义的事件处理程序,所以我可以在大约x秒内做一些事情。不重要。 所以我剥离了一些代码,如SetState

注意这适用于1年orso

我尝试了什么:

  • 项目 - &gt;清洁
  • 清理项目的Bin和Obj文件夹
  • 重新创建XML布局

如果我使用一个简单的按钮,它不会崩溃。 Resource.Id.btnTimer ofcourse作为Button

存在于XML布局中

请问有人有任何想法或提示吗?

XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/background"
    android:minWidth="25px"
    android:minHeight="25px">
    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:minWidth="25px"
        android:minHeight="25px">
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:minWidth="25px"
            android:minHeight="25px">
            <TextView
                android:text="Status"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/textView1" />
            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:enabled="false"
                android:id="@+id/txtStatus" />
            <Button
                android:text="Timer Button"
                android:textColor="#FFFFFF"
                android:textSize="30sp"
                android:layout_width="fill_parent"
                android:layout_height="60dp"
                android:background="@drawable/ButtonState"
                android:shadowColor="#C4BEBE"
                android:layout_gravity="center"
                android:shadowDx="0"
                android:shadowDy="0"
                android:shadowRadius="5"
                android:layout_marginTop="10.1dp"
                android:layout_marginBottom="10.1dp"
                android:id="@+id/btnTimer" />

        </LinearLayout>
    </ScrollView>
</LinearLayout>

2 个答案:

答案 0 :(得分:1)

将布局中的Button更改为{your package name here}.TimerButton

类似的东西:

enter image description here

com.sushihangover.custombutton.XAMLButton

示例XAML:

<Button
    android:id="@+id/myButton"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello" />
<com.sushihangover.custombutton.XAMLButton
    android:id="@+id/customButton"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello" />

注意:

您必须注册C#/ Java包装器,以便它们具有完全限定的Java类名称:

[Register("com.sushihangover.custombutton.XAMLButton")]
public class XAMLButton : Button

答案 1 :(得分:1)

您的btnTimerButton而不是TimerButton。将<Button>替换为<MyProject.TimerButton>。将MyProject替换为TimerButton类的NameSpace。