2014-06-12 56 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); 

希望这会有用。

相关问题