带有Wrap_Content宽度的垂直线性布局 - 让孩子将其填充到最宽的孩子

时间:2014-06-12 13:07:55

标签: android android-layout android-linearlayout fill-parent

我想与几个LinearLayout个孩子一起创建垂直Button,其中每个孩子的宽度最宽。

但是,根据使用MATCH_PARENTWRAP_CONTENT为子宽度,我得到LinearLayout整个屏幕的宽度,或Buttons不填充{{1 }}。屏幕截图如下(填充/换行):

fill example wrap example

示例活动代码:

LinearLayout

正如您在第二个屏幕截图中看到的那样,红线实际上占据了整个宽度而没有拉伸@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,这会给我预期的结果:

wanted result

代码:

MATCH_PARENT

虽然它并不是一种优雅的解决方案 - 这种情况是否有任何预期的机制,我错过了?

1 个答案:

答案 0 :(得分:0)

以下是诀窍:

  1. 提及包含按钮(代码中的buttonsView)的LinearLayout的宽度为WRAP_CONTENT。
  2. 提及每个按钮的宽度为MATCH_PARENT
  3. 如果您不包含redLineDivider视图,您的程序应该会给您预期的结果。设置redLineDivider的宽度似乎存在一些问题。作为替代方案,您可以将其声明为LinearLayout,以使您的代码完美运行。

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

    希望这会有用。