在Android開發中,有時候,為了適配不同的屏幕,使得UI看上去美觀,就需要根據當前的屏幕尺寸來動態地添加視圖。一般分為三個步驟:
1.新建組件;
2.獲得父視圖尺寸;
3.根據父視圖尺寸,計算將要添加的子視圖的尺寸和坐標位置,根據這些參數建立父視圖的布局參數(LayoutParam),并將子視圖添加到父視圖中。
下面用一個例子來說明——在一個RelativeLayout中動態添加一個Button。
一 獲得xml中的RelativeLayout,新建Button
RelativeLayout relativeLayout = (RelativeLayout)findViewById(R.id.relativeLayout);
Button btn = new Button(getApplicationContext());
二 獲得父視圖尺寸
double parentWidth = relativeLayout.getWidth();
double parentHeight = relativeLayout.getHeight();
注意事項:如果在onCreate()或者onResume()方法中調用父視圖的getWidth()和getHeight()方法,返回的值為0。這是因為父視圖(以及別的視圖)還沒有完成繪制,必須等待系統繪制完父視圖時,才能去調用這兩個方法獲得父視圖最終的尺寸。所以解決的辦法就是等待父視圖繪制完成之后,再去調用getWidth()和getHeight(),和進行后續的步驟。這里介紹一個方法——將一個runnable添加到父視圖隊列中的方法:View.post(),作者是kissazi2:
作者:kissazi2
出處:http://www.cnblogs.com/kissazi2/
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
runnable對象中的方法會在View的measure、layout等事件后觸發,具體的參考Romain Guy:
UI事件隊列會按順序處理事件。在setContentView()被調用后,事件隊列中會包含一個要求重新layout的message,所以任何你post到隊列中的東西都會在Layout發生變化后執行。
這個方法的優點在于:
1、runnable里面的代碼只會執行一次
2、語法很簡單
思路代碼如下:
final View view=//smth;
...
view.post(new Runnable() {
? ? ?@Override
? ? ? public void run() {
? ? ? ? ? ?view.getHeight(); //height is ready
? ? ? }
});
具體到本例中這么寫:
relativeLayout.post(new Runnable() {
? ? ?@Override
? ? ?public void run(){
? ? ? ? ? double parentWidth = relativeLayout.getWidth();
? ? ? ? ? double parentHeight = relativeLayout.getHeight();
? ? ? ? ? 后續的各種操作。。。。
? ? ?}
}):
三 根據父視圖尺寸計算將要添加的子視圖的尺寸和坐標位置,根據這些參數建立父視圖的布局參數(LayoutParam),將子視圖添加到父視圖中
double btnHeight = ****;
double btnWidth = ****;
RelativeLayout.LayoutParams btnParam =new RelativeLayout.LayoutParams((int) btnHeight, (int) btnWidth); ? ? ? ? ? ? ? ? ? ? ? ? ? ? //初始化父視圖布局參數,設置Button的大小
btnParam.leftMargin= ****; ? ?//Button距離父視圖左邊界的距離
btnParam.topMargin= ****; ? //Button距離父視圖頂部的距離
relativeLayout.addView(btn, btnParam); ?//根據子視圖在父視圖中的布局參數,將子視圖添加到父視圖中
到此為止,Button就被動態地添加到RelativeLayout中了。