我有一个奇怪的例外,它在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
我尝试了什么:
如果我使用一个简单的按钮,它不会崩溃。 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>
答案 0 :(得分:1)
将布局中的Button
更改为{your package name here}.TimerButton
类似的东西:
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)
您的btnTimer
是Button
而不是TimerButton
。将<Button>
替换为<MyProject.TimerButton>
。将MyProject
替换为TimerButton
类的NameSpace。