Проблема в том, что я не полностью задокументировал / объяснил, что делает RegisterAttribute.DoNotGenerateAcw
, за что я должен извиниться.
В частности, проблема заключается в следующем: Android Layout XML может ссылаться только на типы Java.Обычно это не проблема, так как Android Callable Wrappers создаются во время сборки, предоставляя типы Java для каждого типа C #, который подклассы Java.Lang.Object
.
Однако Android Callable Wrappersspecial: они содержат объявления методов Java native
, а конструкторы Android Callable Wrapper вызывают в среду выполнения Mono for Android для создания соответствующего класса C #.(См. Пример по приведенному выше URL-адресу и обратите внимание, что тело конструктора вызывает mono.android.TypeManager.Activate()
.)
Однако ваш пример полностью обходит все это, потому что ваш XML-макет не ссылается на Android Callable Wrapperвместо этого он ссылается на ваш тип Java, а ваш тип Java не имеет конструктора, который вызывает mono.android.TypeManager.Activate()
.
В результате получается в точности , что вы и сказали:Создается экземпляр вашего типа Java, и, поскольку нет «соединения», связывающего экземпляр Java с (быть) созданным экземпляром C # (вызов mono.android.TypeManager.Activate()
), экземпляр C # не создается, что является поведением, которое вы видите.
Все это звучит для меня совершенно вменяемым, но я тот парень, который написал это, поэтому я пристрастен.
Итак, что вы хотите, чтобы произошло?Если вам действительно нужна рукописная Java ImageView
, как вы уже сделали, то есть только один разумный конструктор C #, который нужно вызвать: конструктор (IntPtr, JniHandleOwnership)
.Все, что не хватает, это отображение между типом Java и типом C #, которое вы можете сделать «где-нибудь» во время запуска приложения с помощью TypeManager.RegisterType () :
Android.Runtime.TypeManager("com/example/widget/ImageView",
typeof(Example.Widgets.ImageView));
Если у вас естьэто отображение на месте, тогда, когда экземпляр com.example.widget.ImageView
обнаруживается в управляемом коде, он будет обернут в экземпляр Example.Widgets.ImageView
, используя конструктор (IntPtr, JniHandleOwnership)
.
Если вместо этого вы хотите иметьваш конструктор C # (Context context, IAttributeSet attrs, int defStyle)
вызван, вы должны обойти свой тип оболочки и просто придерживаться кода C #:
namespace Example.Widgets {
public class ImageView : global::Android.Widget.ImageView {
...
В итоге, RegisterAttribute.DoNotGenerateAcw
является «особенным»: это означает, что вы «алиасуете»существующий тип Java, и что «нормальное» поколение Android Callable Wrapper должно быть пропущено.Это позволяет всем работать (у вас не может быть двух разных типов с одним и тем же полностью определенным именем), но добавляет другой набор сложностей.