Dav*_*vid 45 android scrollview android-custom-view android-layout xamarin.android
我正在构建一个Android应用程序,它使用在此处找到的自定义构建的TwoDScrollView:
http://blog.gorges.us/2010/06/android-two-dimensional-scrollview/
可以在其他几个网站上找到同一个类,Stack Overflow上的其他人也提出了有关它的问题.我在以前使用Java/Eclipse构建的Android应用程序中使用它,并且我取得了成功.
在我目前的应用程序中,我想使用C#和MonoDroid.我决定用C#重写整个TwoDScrollView类.在重写它,然后在一些布局XML中使用它之后,我在尝试运行我的代码时遇到以下异常:
抛出了System.NotSupportedException.无法从本机句柄44f4d310激活MyProject.TwoDScrollView类型的实例.
System.Exception:找不到MyProject.TwoDScrollView ::.ctor(System.IntPtr,Android.Runtime.JniHandleOwnership)......的构造函数......后面有更多文本....
我的布局XML如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<myproject.TwoDScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</myproject.TwoDScrollView>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
根据以下链接中有关在MonoDroid中使用布局XML中的自定义视图的说明:http://docs.xamarin.com/android/advanced_topics/using_custom_views_in_a_layout
TwoDScrollView类的构造函数如下所示:
public TwoDScrollView(Context context)
: base(context)
{
initTwoDScrollView();
}
public TwoDScrollView(Context context, IAttributeSet attrs)
: base(context, attrs)
{
initTwoDScrollView();
}
public TwoDScrollView(Context context, IAttributeSet attrs, int defStyle)
: base(context, attrs, defStyle)
{
initTwoDScrollView();
}
Run Code Online (Sandbox Code Playgroud)
C#版本中存在与Java版本相同的构造函数(可以在上面的链接中找到).什么可能出错?如果有人想看,我可以发布我的TwoDScrollView的完整C#代码.除了用C#重写之外,它基本上与位的Java代码位相同.
谢谢你的帮助!
jon*_*onp 89
恭喜!你遇到了漏洞的抽象.: - /
问题是:无论好坏,来自构造函数的虚方法调用会调用派生最多的方法实现.在这方面C#与Java相同; 考虑以下计划:
using System;
class Base {
public Base ()
{
Console.WriteLine ("Base..ctor");
M ();
}
public virtual void M ()
{
Console.WriteLine ("Base.M");
}
}
class Derived : Base {
public Derived ()
{
Console.WriteLine ("Derived..ctor");
}
public override void M ()
{
Console.WriteLine ("Derived.M");
}
}
static class Demo {
public static void Main ()
{
new Derived ();
}
}
Run Code Online (Sandbox Code Playgroud)
运行时,输出为:
Base..ctor
Derived.M
Derived..ctor
Run Code Online (Sandbox Code Playgroud)
也就是说,在构造函数执行Derived.M()
之前调用该方法Derived
.
在Mono for Android中,事情变得更加复杂.所述的Android调用包装(ACW)的构造是由Java的调用和负责创建的对等体C#实例和映射的Java实例的C#实例.但是,如果从Java构造函数调用虚方法,则会在有一个C#实例调用该方法之前调度该方法!
让它沉入一点.
我不知道哪种方法触发场景为您的特定代码(代码片段您提供优良工程),但我们确实有它打这种情况的例子:LogTextBox 覆盖的TextView.DefaultMovementMethod属性和TextView
构造函数调用的getDefaultMovementMethod()
方法.结果是Android尝试LogTextBox.DefaultMovementMethod
在LogTextBox
实例存在之前调用.
那么Mono for Android会做什么?单声道的Android创建的ACW,并且因此知道哪个C#类型的getDefaultMovementMethod()
方法应被授予.它没有的是一个实例,因为还没有创建实例.因此,Mono for Android通过(IntPtr, JniHandleOwnership)
构造函数创建了相应类型的实例,如果找不到此构造函数则会生成错误.
一旦(在这种情况下)TextView
构造函数完成执行后,LogTextBox
的ACW构造函数会执行,在这一点单为Android会去'啊哈!我们已经创建了这个Java实例的C#实例’,并将然后调用相应的已创建的实例上的构造函数.这意味着对于单个实例,将执行两个构造函数:(IntPtr, JniHandleOwnership)
构造函数和(稍后)(Context, IAttributeSet, int)
构造函数.
jpo*_*bst 27
错误消息说:
System.Exception: No constructor found for MyProject.TwoDScrollView::.ctor(System.IntPtr, Android.Runtime.JniHandleOwnership)
尝试添加像它说的构造函数,看看是否有帮助:
public TwoDScrollView (IntPtr a, JniHandleOwnership b) : base (a, b)
{
}
小智 11
我对自定义imageview有同样的问题,jpobst的答案肯定完全解决了这个问题:
public CircularImageView(Context context)
:base(context)
{
init (context, null, 0);
}
public CircularImageView(Context context, IAttributeSet attrs)
: base(context, attrs)
{
init (context, attrs, Resource.Attribute.circularImageViewStyle);
}
public CircularImageView(Context context, IAttributeSet attrs, int defStyle)
:base(context, attrs, defStyle)
{
init(context, attrs, defStyle);
}
public CircularImageView (IntPtr a, JniHandleOwnership b) : base (a, b)
{
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
29956 次 |
最近记录: |