1

我想LinearLayout用几个Button孩子创建垂直,每个孩子都有最宽的宽度。

但是,根据使用MATCH_PARENTWRAP_CONTENT用于儿童宽度,我要么LinearLayout采用整个屏幕的宽度,要么Buttons不填充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,而所有其余的都使用MATCH_PARENT,这给了我预期的结果:

想要的结果

代码:

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

不过,这感觉不像是优雅的解决方案——对于这种情况,我错过了任何预期的机制吗?

4

1 回答 1

0

以下是诀窍:

  1. 将包含按钮(代码中的按钮视图)的 LinearLayout 的宽度称为 WRAP_CONTENT。
  2. 将每个按钮的宽度称为 MATCH_PARENT

如果您不包含 redLineDivider 视图,您的程序应该会给您预期的结果。设置 redLineDivider 的宽度似乎有一些问题。作为替代方案,您可以将其声明为 LinearLayout 以使您的代码完美运行。

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

希望这会有用。

于 2014-06-12T19:37:18.507 回答