做這個AA項目時雇初,本著盡可能將不懂得東西搞明白的想法域庇,我對于view
有了更深的理解字币,下面是我打的一個比方蕾哟。
假設activity
是工人一忱,那么這個工人開始工作時通過attach()
方法啟動了一個phoneWindow
對象,這個對象就是一個窗戶谭确,然后有了窗戶就應該裝
一塊玻璃帘营,而installDecor()
方法就是得到玻璃的,這是一個DecorView
逐哈,在系統(tǒng)的視圖樹中芬迄,這是根視圖,下面就是一個linearLayout
昂秃,然后在
這個LinearLayout
下面是兩個FrameLayout
禀梳,其中一個下面直接放入一個TextView
,這個TextView
用于顯示標題肠骆,另一個FrameLayout
下面再接一個
LinearLayout
算途,而這個LinearLayout
就是我們真正開始放入內容的布局。然后有了窗戶后我們應該貼窗花蚀腿,因為這樣才會顯得有內容嘴瓤,那么,什么
是窗花呢?窗花就是各種控件廓脆,也就是在布局xml
中定義的各種控件畏浆,當然,有xml
方式就有代碼的方式狞贱,大同小異刻获。那么如何將窗花貼到玻璃上
呢?這里需要說明瞎嬉,你將窗花貼到玻璃上蝎毡,并不是說直接貼在玻璃上,而是貼在一張紙上再貼在玻璃上氧枣,因為這樣方便管理(包括撤銷和添加的位
置等)沐兵,這一點很重要,這也就意味著便监,顯示出來的控件一定是貼在紙上的扎谎,不管是窗戶上原來的紙還是你新創(chuàng)建的紙,同時烧董,如果你要尋找到窗
花毁靶,可以通過findViewById()
方法來尋找到,但是如果你要對窗花進行修改和使用逊移,那么這個窗花一定是要在紙上的预吆,而且你找到的窗花一定要是
這個紙上的窗花,也就是在findViewById()
方法前加上view
來指定是哪張紙胳泉,也就是說這張紙一定要加載出來拐叉,比如,一下代碼:
ViewGroup viewGroup1= (ViewGroup) LayoutInflater.from(this).inflate(R.layout.activity_main,null);
RelativeLayout r= (RelativeLayout) viewGroup1.findViewById(R.id.r);
Button b=new Button(this);
b.setText("b1");
r.addView(b);
setContentView(r);
這個代碼是沒有問題的扇商,但是凤瘦,如果將第一行代碼刪了,變成:
RelativeLayout r= (RelativeLayout) findViewById(R.id.r);
Button b=new Button(this);
b.setText("b1");
r.addView(b);
setContentView(r);
那么案铺,就會報錯蔬芥,內容大概是調用addView(b)
方法的對象是空的。
那么紙是什么呢?紙其實就是view
红且,是通過LayoutInflater
的inflate()
方法生成的坝茎,同時這里還需要提一點涤姊,如果你想將一張紙上的窗花黏在另一
張紙上暇番,那么,你首先需要將這個窗花從原來的紙上撕下來思喊,然后再將這個窗花貼在另一張紙上壁酬,這里的撕就是原來紙調用removeView()
方法,
然后黏在另一張紙上,就是另一張紙調用addview()
方法舆乔,那么這樣能實現(xiàn)什么呢岳服?
1.動態(tài)的將布局呈現(xiàn)
2.將布局的一部分替換掉
3.實現(xiàn)類似側滑菜單的效果
這里還要提一點,因為窗口的大小是有限的希俩,所以可能你的紙上的控件沒有顯示完全吊宋,如果你將這個紙上邊的控件清除再調整紙的位置,或者直
接通過調整紙的位置將紙上邊的控件擠掉颜武,來達到讓這張紙完全顯示的結果璃搜,那么這意味著什么呢?
意味著可以通過這種方式實現(xiàn)側滑菜單的效果。
其實說到底鳞上,側滑菜單的效果的實現(xiàn)實際上就是實現(xiàn)將布局的一部分替換掉和動態(tài)呈現(xiàn)布局的功能这吻,要掌握替換布局和動態(tài)呈現(xiàn)布局的原理,并
且靈活運用篙议。比如實現(xiàn)側滑菜單就有幾種方式唾糯,不過原理都是一樣的,下面列舉一下我的兩種方式:
1.在主布局中就有側滑時需要的布局鬼贱,只是一開始不讓它呈現(xiàn)出來(設置高度等屬性)移怯,然后當點擊時呈現(xiàn)出來(往往是通過替換掉原來呈現(xiàn)出來的控件)
2.在主布局中沒有側滑時需要的布局,當點擊時讓它自己動態(tài)加載出來这难,然后貼在相應的位置的紙上芋酌。
同時需要注意一下,setcontentView()
方法是將紙黏在玻璃上雁佳,那么這張紙是哪張紙呢脐帝?這張紙就是你傳入的參數(shù),比如下面兩種代碼的區(qū)別:
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
RelativeLayout r= (RelativeLayout) findViewById(R.id.r); RelativeLayout r= (RelativeLayout) findViewById(R.id.r);
TextView t1= (TextView) r.findViewById(R.id.t); TextView t1= (TextView) r.findViewById(R.id.t);
t1.setText("t1"); t1.setText("t1")
b.setText("b1"); b.setText("b1");
r.addView(b); r.addView(b);
setContentView(r); setContentView(R.layout.activity_main);
這兩代碼就是最后一行不同糖权,左邊的代碼顯示出來是一個內容為t1的TextView和B1的Button堵腹, 右邊的代碼顯示出來的是只有一個內容為hello world的TextView
這也就說明了顯示出來的內容就是你傳入的紙的內容,有人可能覺得這是廢話星澳,但是你寫代碼的時候可能就會搞混了疚顷,所以在這里提出來,一定要記住禁偎。