我正在編寫一個應用程序,其目的只是試圖瞭解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);
問題:
種皮的
onDraw(Canvas canvas)
方法是永遠調用。我已經看到這個說法的一些解決方案,我的觀點沒有任何尺寸(高度/寬度= 0),但是,情況並非如此。當我覆蓋onLayout()
時,我得到了我的佈局的尺寸,它們是正確的。另外,getHeight()/ Width()與它們應該完全相同。我也可以覆蓋dispatchDraw()
並獲得我的基本觀點來繪製自己。我想動畫
TestB
中的對象。傳統上,我會在調用invalidate()
時自己覆蓋onDraw()
方法,直到對象完成本應該執行的動畫。但是,在TestB
中,當我撥打invalidate()
時,該視圖永遠不會重繪。我的印象是,我的父視圖的工作再次調用onDraw()
方法,但我的父視圖不再調用dispatchDraw()
。
我想我的問題是,爲什麼就永遠也不會打電話給我我父視圖onDraw()
方法來開始?當我的父視圖中的某個方法在其中一個孩子失效時應該調用什麼方法?父母是否負責確保孩子被吸引,或者Android是否負責照顧?如果Android響應invalidate()
,爲什麼我的TestB
永遠不會再被繪製?
你可以在你的博客中分享這個Viewgroup的演示項目嗎?或者它會是非常有用的地方..謝謝你的夥伴.. – user1201239
即使我們在XML中指定它,我是否需要添加childView? – user1201239
對不起。我沒有博客或任何要上傳的內容。我會盡力盡可能地提供幫助。回答你的第一個問題,不。當你膨脹xml時,這個孩子被包含在'ViewGroup'中。最早可以檢索它的是'onFinishInflate()'。之後,你有一個選擇。或者通過'getChildAt(int index)'方法讓你的孩子或者使用'findViewById(int id)'。索引將是孩子在xml中的順序。我不知道索引是如何與兒童內的孩子一起工作的。 – DeeV