РЕДАКТИРОВАТЬ: Мне не хватало ключевой концепции, очереди сообщений, при создании моего пользовательского представления и попытке обновить представление без использования его оказалось источником проблемы, с которой я столкнулся. Здесь выясняется:
Android: запись пользовательских просмотров, поддерживающих очередь сообщений
Оказывается, вы должны позволить runtime/android вызывать OnMeasure после выхода OnCreate ( "как обычно" ), и в то же время помещать любые обновления в представление в очереди сообщений с помощью метода .post.
Итак, вы можете захватить дескриптор представления, через FindViewById, в OnCreate, как обычно, а затем публиковать любые обновления (либо с помощью переопределений, как setText, либо ваших собственных функций набора) в пределах runnable (см. ссылку выше).
Я работаю над пользовательским представлением в андроиде довольно давно и на самом деле экспериментировал с конструкторами, атрибутами, параметрами макета и методами рисования (OnMeasure, OnLayout,...).
Основная группа представлений parent-most (объявленная в файле макета для рендеринга) наследует 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 (где я могу получить их без проблем, однако из-за того, что размеры макета представлений детей определяются из этих размеров представлений, я не могу создать экземпляр childeren до первого вызова OnMeasure, и это оказывается после того, как он мне понадобится, после выхода OnCreate).
То есть, вызывая SetContentView в OnCreate, а затем создавая экземпляр пользовательского представления из него через FindViewById (Resource.Id.Calendar1), дочерние представления также не получают экземпляр, если он сделан из переопределения OnMeasure (опять же, b/c OnMeasure не вызывается до тех пор, пока не вернется OnCreate).
Если я прочитал атрибуты, переданные в конструктор, все, что я получаю от layout_width и layout_height, являются константой -1 для fill_parent. Я не могу просто использовать весь экран, потому что есть другие виды для компенсации.
Поэтому я ищу наилучший подход при определении размеров пользовательского представления внутри его конструктора, чтобы я мог создать экземпляр из него (конструктора) с соответствующими размерами макета, чтобы представления доступны для OnCreate (для обновления с содержимым) после вызова SetContentView и перед возвратом из OnCreate.
Другим средством для того же самого конца будет хорошо со мной, хотя я как бы желаю сделать это так, как это хочет инфраструктура (если есть такая вещь).