1

私は、それぞれの子が最も広い幅を持つ、LinearLayoutいくつかの子を持つ垂直を作成したいと考えています。Button

ただし、子供の幅の使用MATCH_PARENTまたは使用に応じて、画面全体の幅を取得するか、塗りつぶさないかのいずれかになります。以下のスクリーンショット (塗りつぶし/ラップ):WRAP_CONTENTLinearLayoutButtonsLinearLayout

記入例 ラップの例

アクティビティ コードの例:

@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;
}

2 番目のスクリーンショットでわかるように、赤い線は実際には引き伸ばされずに全幅になりLinearLayoutます。これは、少なくとも 1 つのビューで幅が設定されているためです。

私が思いついた潜在的な修正は、最も幅の広いボタン (テキストが最も長い) を見つけてそれを使用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. ボタン (コード内の buttonsView) を含む 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 に答える