Я пишу приложение с единственной целью попытаться понять, как работает иерархия представлений в Android. Сейчас у меня есть некоторые серьезные проблемы. Я постараюсь дать краткое объяснение здесь.Попытка понять иерархию просмотров
В настоящее время у меня есть три Представления. 2 - ViewGroups
, а 1 - только View
. Допустим, они в таком порядке:
TestA extends ViewGroup
TestB extends ViewGroup
TestC extends View
TestA->TestB->TestC
Where TestC is in TestB and TestB is in TestA.
В моей Activity
я просто отобразить взгляды, как так:
TestA myView = new TestA(context);
myView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));
setContentView(myView);
Проблемы:
Метод Testa
onDraw(Canvas canvas)
никогда не является называется. Я видел пару решений этой фразы о том, что мой взгляд не имеет размеров (height/width = 0), однако это не так. Когда я переопределяюonLayout()
, я получаю размеры моего макета, и они верны. Кроме того, getHeight()/Width() точно такие, какими они должны быть. Я также могу переопределитьdispatchDraw()
и получить свои базовые представления, чтобы нарисовать себя.Я хочу анимировать объект в
TestB
. Традиционно я бы переопределил методonDraw()
по вызовуinvalidate()
сам по себе, пока объект не закончит анимацию, которую он должен был сделать. Однако вTestB
, когда я звонюinvalidate()
, вид никогда не перерисовывается. У меня создается впечатление, что работа моего родительского представления снова вызывает методonDraw()
, но мое родительское представление снова не вызываетdispatchDraw()
.
Я думаю, мои вопросы, почему бы мой onDraw()
метод моего родительского вида никогда не дозвонились начать? Какие методы в моем родительском представлении должны быть вызваны, когда один из его дочерних элементов недействителен? Является ли родитель ответственным за обеспечение того, чтобы дети были нарисованы или Android позаботился об этом? Если Android отвечает на invalidate()
, почему мой TestB
никогда не будет нарисован снова?
вы можете поделиться этим демо-проектом Viewgroup в своем блоге или где-нибудь это будет очень полезно .. Спасибо mate .. – user1201239
Мне нужно добавить childView, даже если мы укажем его в XML? – user1201239
Прошу прощения. У меня нет блога или чего-либо еще для загрузки. Я постараюсь быть настолько полезной, насколько смогу. Чтобы ответить на ваш первый вопрос, нет. Когда вы надуваете xml, ребенок содержится в 'ViewGroup'. Самое раннее, что вы можете получить, это 'onFinishInflate()'. После этого у вас есть выбор. Либо получите своих детей с помощью метода getChildAt (int index) ', либо используйте' findViewById (int id) '. Индекс будет тем порядком, в котором дети находятся в xml. Я не знаю, как индексирование работает с детьми внутри детей. – DeeV