Android應用開發—TextView的動態創建 這篇文章講到了“TextView控件布局位置的控制”,主要依賴于RelativeLayout.LayoutParams的使用,本文簡單介紹下LayoutParams的用法
注:本文大部分內容參考android,利用layoutParams代碼動態布局空間位置和總結:代碼中添加LinearLayout和RelativeLayout布局 或者是一份copy,之所以這里重新“寫”一遍,主要是那篇文章的樣式布局,實在有點不太好看。
LayoutParams介紹:
LayoutParams繼承于Android.View.ViewGroup.LayoutParams。LayoutParams相當于一個Layout的信息包,它封裝了Layout的位置、高、寬等信息。假設在屏幕上一塊區域是由一個Layout占領的,如果將一個View添加到一個Layout中,最好告訴Layout用戶期望的布局方式,也就是將一個認可的layoutParams傳遞進去。
可以這樣去形容LayoutParams,在象棋的棋盤上,每個棋子都占據一個位置,也就是每個棋子都有一個位置的信息,如這個棋子在4行4列,這里的“4行4列”就是棋子的LayoutParams。
但LayoutParams類也只是簡單的描述了寬高,寬和高都可以設置成三種值:
- 一個確定的值。
- MATCH_PARENT,即填滿(和父容器一樣大小)。
- WRAP_CONTENT,即包裹住組件就好。
setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
上面的代碼其實是子對父的,也就是說,父布局下的子控件要設置這句話。
因為布局很多,雖然都繼承至ViewGroup但是各個布局還是有很大的不同。
很顯然上面這句應該這樣寫才算準確:
setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT,TableRow.LayoutParams.FILL_PARENT));
這表示這個子控件的父布局是一個TableRow, 這樣的LayoutParams 太多,所以應明確指明。
下面分別說下兩個常用到布局:
- FrameLayout下動態設置子控件居中,動態用JAVA代碼要這樣實現:
FrameLayout.LayoutParams lytp = new FrameLayout.LayoutParams(80,LayoutParams.WRAP_CONTENT);
lytp.gravity = Gravity.CENTER;
btn.setLayoutParams(lytp);
- RelativeLayout下動態設置子控件居中:
RelativeLayout.LayoutParams lp=new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
lp.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
btn1.setLayoutParams(lp);
在ANDROID 開發中,有時候我們需要在后臺動態添加布局文件,這里我們來說一下后臺添加LinerLayout布局和RelativeLayout文件的方式:
LinearLayout 布局:
線性布局,組件以垂直或水平方向線性排列。 android.widget.LinearLayout有個繼承自android.view.ViewGroup.LayoutParams 的內嵌類LayoutParams,使用這個類的實例調用 LinearLayout.addView 就可以實現“線性布局”。
首先我們需要定義一個LinearLayout的布局參數params,如下:
- 方式一:指定高、寬
LinearLayout.LayoutParams params = new LinearLayout.LayoutParam(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT)
- 方式二:指定高、寬、權重,其中LayoutParams中的兩個參數分別為:子控件的高、寬。
LinearLayout.LayoutParams params = new LinearLayout.LayoutParam(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT, weight)
設置控件相對于容器本身的位置:
LinearLayout.LayoutParams.gravity =
Gravity.NO_GRAVITY/Gravity.TOP/Gravity.BOTTOM/Gravity.LEFT/Gravity.RIGHT
RelativeLayout布局:
RelativeLayout布局,是以“相對”位置/對齊為基礎的布局方式。android.widget.RelativeLayout 有個繼承自android.view.ViewGroup.LayoutParams 的內嵌類 LayoutParams,使用這個類的實例調用 RelativeLayout.addView 就可以實現“相對布局”。
首先我們需要定義一個 RelativeLayout的布局參數relLayoutParams,如下:
RelativeLayout.LayoutParams relLayoutParams=new RelativeLayout.LayoutParam(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT)
其中LayoutParams中兩個參數分別為:子控件的寬(width),子控件的高(height),除了可以為LayoutParams.FILL_PARENT(android.view.ViewGroup.LayoutParams)等系統常量外還可以是數值,比如400。
- 通過LayoutParams的 addRule方法來額外的添加別的規則:
android.widget.RelativeLayout.LayoutParams.addRule(int verb, int anchor)
其中 anchor 參數指定可以是 View 的 id(“相對于誰”)。RelativeLayout.TRUE(啟用某種對齊方式)或者是-1(應用于某些不需要 anchor 的 verb)[因為 RelativeLayout.TRUE的值為 -1 ,所以-1或者RelativeLayout.TRUE都是可以是 0 (不啟用這個規則)
其中 verb 參數指定相對的“動作”:
1. 如果是相對于父控件的相對布局的話 anchor 參數可以不用或者設置為-1或者RelativeLayout.TRUE。
2. 如果是相對于級別和自己同一級的控件的話參數設置應該是 view 的id。
3. 如果參數設置為 0 的話,則表示這個規則不會運用到該控件的布局中,當是相對于本身的父控件的時候這個參數可以省略。
eg:
relLayoutParams.addRule(RelativeLayout.ABOVE,imageViewId.getId())
// 子控件相對于控件:imageViewId在其的上面
relLayoutParams.addRule(RelativeLayout.BELOW ,imageViewId.getId())
// 子控件相對于控件:imageViewId在其的下面
relLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, -1) 與
relLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE) 與
relLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT )
// 表示的是一樣的表示子控件在父控件的右邊
// 離某元素的左、上、右、下的距離單位
relLayoutParams.setMargins(arg0, arg1, arg2, arg3) relLayoutParams.topMargin=5
RelativeLayout的相關變量:
relLayoutParams.alignWithParent=true 如果對應的兄弟元素找不到的話就以父元素做參照物
RelativeLayout.CENTER_HORIZONTAL 在父控件中水平居中
RelativeLayout.CENTER_VERTICAL 在父控件中垂直居中
RelativeLayout.CENTER_IN_PARENT 相對于父控件完全居中
RelativeLayout.ALIGN_PARENT_BOTTOM 緊貼父控件的下邊緣
RelativeLayout.ALIGN_PARENT_TOP 緊貼父控件的上邊緣
RelativeLayout.ALIGN_PARENT_LEFT 緊貼父控件的左邊邊緣
RelativeLayout.ALIGN_PARENT_RIGHT 緊貼父控件的右邊緣RelativeLayout.ABOVE 在某元素的上方 需要第二個參數為某元素的ID
RelativeLayout.BELOW 在某元素的下方 需要第二個參數為 某元素的ID
RelativeLayout.LEFT_OF 在某元素的左邊 需要第二個參數為某元素的ID
RelativeLayout.RIGHT_OF 在某元素的右邊 需要第二個參數為 某元素的ID
RelativeLayout.ALIGN_TOP 本元素的上邊緣和某元素的的上邊緣對齊 需要第二個參數為某元素的ID
RelativeLayout.ALIGN_BOTTOM 本元素的上邊緣和某元素的的下邊緣對齊 需要第二個參數為某元素的ID
RelativeLayout.ALIGN_LEFT 本元素的上邊緣和某元素的的左邊緣對齊 需要第二個參數為某元素的ID
RelativeLayout.ALIGN_RIGHT 本元素的上邊緣和某元素的的右邊緣對齊 需要第二個參數為某元素的ID
RelativeLayout.ALIGN_BASELINE 本元素的基線和某元素的的基線對齊 需要第二個參數為某元素的ID