2010-03-20 126 views
221

我正嘗試使用Java(而不是XML)創建帶有填充屏幕並具有頁邊距的按鈕的LinearLayout。下面是代碼,沒有利潤的工作:以編程方式在LinearLayout中設置頁邊距

LinearLayout buttonsView = new LinearLayout(this); 
buttonsView.setOrientation(LinearLayout.VERTICAL); 
for (int r = 0; r < 6; ++r) { 
    Button btn = new Button(this); 
    btn.setText("A"); 

    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); // Verbose! 
    lp.weight = 1.0f; // This is critical. Doesn't work without it. 
    buttonsView.addView(btn, lp); 
} 

ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT); 
setContentView(buttonsView, lp); 

使作品很好,但如何在地球上你給的按鈕利潤率所以他們之間的空間?我嘗試使用LinearLayout.MarginLayoutParams,但沒有weight成員,所以它不好。如果您在其構造函數中傳遞lp,它也不起作用。

這是不可能的嗎?因爲它看起來確實如此,並且它不會是您只能在XML中執行的第一個Android佈局任務。

+1

http://developer.android.com/reference/android/view/ViewGroup.MarginLayoutParams.html#setMargins(int,INT,INT,INT)代替layoutParams.setMargins(30, 20,30,0);你把layoutParams.setMargins(30dp,20dp,30dp,0dp); – DarthestVader 2012-01-09 17:40:30

+3

setMargins以int作爲參數..您只能使用xml attributtes – jyavenard 2012-02-01 08:05:56

回答

432

這裏是一個小的代碼來完成它:

LinearLayout ll = new LinearLayout(this); 
ll.setOrientation(LinearLayout.VERTICAL); 

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); 

layoutParams.setMargins(30, 20, 30, 0); 

Button okButton=new Button(this); 
okButton.setText("some text"); 
ll.addView(okButton, layoutParams); 
+0

它也可能爲代碼中的小部件提供邊距。 – 2010-07-13 11:45:31

+6

感謝您提供點對點代碼示例 - 比描述更有益 – 2011-05-24 19:08:03

+24

看起來邊緣參數設置爲像素。任何方式來設置他們在DPS? – 2011-07-14 22:40:45

62

使作品很好,但如何在地球上 你給按鍵邊距,以便 它們之間存在的空間嗎?

你叫setMargins()LinearLayout.LayoutParams對象。

我試着用 LinearLayout.MarginLayoutParams,但 不具有配重部件,因此沒有 好。

LinearLayout.LayoutParamsLinearLayout.MarginLayoutParams一個子類,如documentation指示。

這是不可能的嗎?

它不會是第一款Android 佈局任務中,你只能在XML

做歡迎您提供這種說法的證據。

就我個人而言,我不知道任何只能通過XML而不能通過SDK中的Java方法完成的任何事情。事實上,根據定義,所有事情都必須通過Java來實現(儘管不一定通過SDK可達方法),因爲XML不是可執行代碼。但是,如果您瞭解某些事情,請指出,因爲這是SDK中的一個錯誤,應該有一天會得到修復。

+2

提供「dp」哈,好吧我現在明白了。在這個相當複雜的佈局系統中有點迷失。我不認爲有什麼可以在運行時設置layout_widgth/height。 – Timmmm 2010-03-20 10:51:52

+2

而且沒有辦法設置樣式:http://stackoverflow.com/questions/2016249/how-to-programmatically-setting-style-attribute-in-a-view – Timmmm 2010-03-20 11:04:40

+1

我沒有設置寬度的問題和通過'LayoutPararms'在運行時的高度。我的風格的條款...是的,好吧,有一個原因,我不使用他們。 :-) – CommonsWare 2010-03-20 11:42:19

28

要直接增加利潤的項目(部分項目利潤率允許直接編輯),你可以這樣做:

LayoutParams lp = ((ViewGroup) something).getLayoutParams(); 
if(lp instanceof MarginLayoutParams) 
{ 
    ((MarginLayoutParams) lp).topMargin = ...; 
    ((MarginLayoutParams) lp).leftMargin = ...; 
    //... etc 
} 
else 
    Log.e("MyApp", "Attempted to set the margins on a class that doesn't support margins: "+something.getClass().getName()); 

...這工作不需要知道/編輯周圍的佈局。請注意「instanceof」檢查,以防您嘗試針對不支持邊距的事件運行此檢查。

+2

它正是我尋找的。 – djdance 2014-07-24 21:04:23

+2

比最投票/接受的答案更準確和適用... – Rick 2016-11-11 18:22:09

7

試試這個

LayoutParams params = new LayoutParams(
      LayoutParams.WRAP_CONTENT,  
      LayoutParams.WRAP_CONTENT 
    ); 
    params.setMargins(left, top, right, bottom); 
    yourbutton.setLayoutParams(params); 
+1

這對我不起作用。 – Nik 2014-08-22 15:06:12

19

由於設備屏幕像素密度變化的好總是使用DIP單元以編程方式設置保證金。像下面一樣_

//get resources 
Resources r = getResources(); 
float pxLeftMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics()); 
float pxTopMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics()); 
float pxRightMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics()); 
float pxBottomMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, r.getDisplayMetrics()); 

//get layout params... 
LayoutParams params=new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 
params.setMargins(Math.round(pxLeftMargin), Math.round(pxTopMargin), Math.round(pxRightMargin), Math.round(pxBottomMargin)); 

//set margin... 
yourLayoutTOsetMargin.setLayoutParams(params); 

希望這會有所幫助。

8

我已經設置了利潤率直接使用下面的代碼

LinearLayout layout = (LinearLayout)findViewById(R.id.yourrelative_layout); 
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);    
params.setMargins(3, 300, 3, 3); 
layout.setLayoutParams(params); 

只有在這裏的是要注意到LayoutParams應進口下列包android.widget.RelativeLayout.LayoutParams,否則會出現錯誤。

3
/* 
* invalid margin 
*/ 
private void invalidMarginBottom() { 
    RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) frameLayoutContent.getLayoutParams(); 
    lp.setMargins(0, 0, 0, 0); 
    frameLayoutContent.setLayoutParams(lp); 
} 

你應該潔具視圖的viewGroup.In的上述代碼的類型,例如,我想改變的FrameLayout的保證金,以及FrameLayout裏的視圖組是RelativeLayout的,所以你需要隱蔽到(RelativeLayout.LayoutParams)

5
MarginLayoutParams layoutParams = (MarginLayoutParams) getLayoutParams(); 
layoutParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin); 
+2

「儘管此代碼可能回答此問題,但最好在此處包含對代碼的解釋。 – xenteros 2016-10-20 06:29:16

0

這裏一行解決方案:

((LinearLayout.LayoutParams) yourLinearLayout.getLayoutParams()).marginToAdd = ((int)(Resources.getSystem().getDisplayMetrics().density * yourDPValue)); 
2

試試這個:

MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams(); 
params.width = 250; 
params.leftMargin = 50; 
params.topMargin = 50; 
相關問題