编辑:我在创建自定义视图并尝试在不使用它的情况下更新视图时错过了一个关键概念,即消息队列,结果证明这是我遇到的问题的根源。这在这里得到了澄清:
事实证明,您需要让运行时/android 在 OnCreate 退出后调用 OnMeasure(“像正常一样”),同时通过 .post 方法将任何更新放入消息队列中。
因此,您可以像往常一样在 OnCreate 中通过 FindViewById 获取视图的句柄,然后在可运行文件中发布任何更新(通过 setText 之类的覆盖或您自己的设置函数)(参见上面的链接)。
我在 android 中开发自定义视图已经有一段时间了,并且已经彻底试验了构造函数、属性、布局参数和绘图方法(OnMeasure、OnLayout,...)。
最父视图组(在布局文件中声明用于渲染的视图组)继承自 RelativeLayout 并包含三个子视图,以及所有自定义/继承的视图组,等等。
我正在实现一个自定义日历(我知道,非常原始且令人兴奋),我将调用 CustomCalendar。所以,在我的布局文件中,我有声明
<MonoDroid.CustomViews.CustomCalendar
xmlns:calendar="http://schemas.android.com/apk/res/net.monocross.appname"
android:id="+id/Calendar1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
calendar:row_count="5"
calendar:col_count="7"
...
/>
这个视图与布局文件中定义的其他一些视图一起存在,因此是我的复杂性的来源,现在将说明。
我试图弄清楚如何在调用 OnMeasure 之前获取该视图的尺寸(在那里我可以得到它们没有问题,但是因为子视图的布局尺寸是由该视图尺寸确定的,所以我无法实例化子视图,直到第一次调用 OnMeasure,这证明是在我需要它之后;在 OnCreate 退出之后)。
也就是说,在 OnCreate 中调用 SetContentView,然后通过 FindViewById(Resource.Id.Calendar1) 从中实例化自定义视图后,如果从 OnMeasure 覆盖完成子视图(再次,b/c OnMeasure直到 OnCreate 返回后才被调用)。
如果我读取传递给构造函数的属性,我从 layout_width 和 layout_height 得到的都是 fill_parent 的常量 -1。我也不能只使用整个屏幕,因为还有其他视图需要补偿。
因此,我正在寻找从其构造函数中确定自定义视图尺寸的最佳方法,以便我可以使用适当的布局尺寸从它(构造函数)实例化所有视图的子项,以便视图可以从在调用 SetContentView 之后和从 OnCreate 返回之前的 OnCreate(用于更新内容)。
达到同一目的的另一种方法对我来说很好,尽管我有点希望按照基础设施的预期方式来做这件事(如果有这样的事情)。