2014-06-12 84 views
1

我想創建垂直LinearLayout和幾個Button孩子,其中每個孩子的寬度都是最寬的。帶有WrapContent寬度的垂直LinearLayout - 讓孩子填充到最寬的孩子

但是根據使用MATCH_PARENTWRAP_CONTENT兒童的寬度,我得到任何LinearLayout考慮整個屏幕的寬度,或Buttons不充盈LinearLayout。下面截圖(填充/套):

fill example wrap example

示例活動碼:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    RelativeLayout mainView = new RelativeLayout(this); 
    mainView.setBackgroundColor(Colors.WHITE); 

    String[] buttonsNames = new String[] { "Short", "Looooooong", "Medium" }; 
    View buttonsView = getButtonsView(buttonsNames); 

    mainView.addView(buttonsView, new RelativeLayout.LayoutParams(
      RelativeLayout.LayoutParams.WRAP_CONTENT, 
      RelativeLayout.LayoutParams.WRAP_CONTENT)); 
    setContentView(mainView); 
} 

private View getButtonsView(String[] buttonNames) { 
    LinearLayout buttonsView = new LinearLayout(this); 
    buttonsView.setOrientation(LinearLayout.VERTICAL); 
    buttonsView.setBackgroundColor(Colors.BLACK); 

    for (int i = 0; i < buttonNames.length; i++) { 
     Button button = new Button(this); 
     button.setText(buttonNames[i]); 

     ///////////// HERE LAYS THE PROBLEM ////////// 

     buttonsView.addView(button, new LinearLayout.LayoutParams(
       LinearLayout.LayoutParams.MATCH_PARENT, 
       //LinearLayout.LayoutParams.WRAP_CONTENT, // neither of them works 
       LinearLayout.LayoutParams.WRAP_CONTENT)); 

     View redLineDivider = new View(this); 
     redLineDivider.setBackgroundColor(Colors.RED); 
     buttonsView.addView(redLineDivider, new LinearLayout.LayoutParams(
       LinearLayout.LayoutParams.MATCH_PARENT, 2)); 
    } 

    return buttonsView; 
} 

正如你可以在第二屏幕截圖看到,紅線實際上採取整個寬度不拉伸LinearLayout - 它是因爲至少有一個視圖設置了寬度。

可能的解決方法我有是要找到最寬的按鈕(最長文本),並使其使用WRAP_CONTENT,而其餘全部使用MATCH_PARENT,這給了我預期的結果出來了:

wanted result

代碼:

buttonsView.addView(button, new LinearLayout.LayoutParams(
       isLongestText(i) ? LinearLayout.LayoutParams.WRAP_CONTENT 
         : LinearLayout.LayoutParams.FILL_PARENT, 
       LinearLayout.LayoutParams.WRAP_CONTENT)); 

雖然它不覺得像優雅的解決方案 - 有沒有這種情況的任何預期的機制,我錯過了?

+0

不是我所知道的。你將不得不做一些內部計算,或者如果你知道哪一個是最長的,你可以使用RelativeLayout結構的對齊功能來嘗試和通過XML對齊它們。 –

回答

0

以下是特技:

  1. 提及含有的按鈕的LinearLayout的寬度(buttonsView在代碼)作爲WRAP_CONTENT。
  2. 提起每個按鈕的寬度MATCH_PARENT

你的程序應該得到預期的結果,如果你不包括redLineDivider查看。設置redLineDivider的寬度似乎存在一些問題。作爲替代方案,您可以將其聲明爲LinearLayout以使您的代碼完美工作。

// View redLineDivider = new View(this); 
// Instead declare it as a LinearLayout 
LinearLayout redLineDivider = new LinearLayout(this); 

希望這會有用。

相關問題