0

サイズが 2*X のテーブルを作成しようとしていますが、列の幅を等しくしたいと考えています。どうすればこれを達成できますか? LinearLayout と tabelLayout の両方を試しましたが、各ラジオ ボタンのテキストが同じである限り、どちらも正常に機能しますが、そうでない場合は、スペースが不均等に分割されます (テキストを均等に分割する余地があります)。 . 実行時に幅を設定することを考えましたが、私の getWidth() は 0 を返します。助けていただければ幸いです。

Ps。XML を使用していない

コード:

imports....
public class SpendoRadioGroup extends LinearLayout implements OnCheckedChangeListener{
private GUI_attrs gui_attrs;
private RadioButton[] buttons;
private RadioButton selected = null;
public SpendoRadioGroup(Context context, AttributeSet attrs) {
    super(context, attrs);
    gui_attrs = new GUI_attrs(context, attrs);

    this.setBackgroundColor(gui_attrs.color_Z1);
    this.setOrientation(LinearLayout.VERTICAL);
    this.setPadding(gui_attrs.padding_Z1, gui_attrs.padding_Z1/2, gui_attrs.padding_Z1, gui_attrs.padding_Z1/2);


    RadioButton[] btns = new RadioButton[2];
    btns[0] = new RadioButton(context);
    btns[0].setText("Item 1");
    btns[1] = new RadioButton(context);
    btns[1].setText("Itemes 2");

    this.setRadioButtons(btns, "Instruction:");
}
public void setRadioButtons(RadioButton[] buttons, String instruction){
    this.removeAllViews();

    TextView tvInstruction = new  TextView(gui_attrs.context);
    tvInstruction.setTextColor(Color.BLACK);
    tvInstruction.setText(instruction);
    tvInstruction.setTextSize(gui_attrs.textSize_tiny);
    this.addView(tvInstruction);

    this.buttons = buttons;
    LinearLayout.LayoutParams param = new LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
    param.weight = 1;
    for(int i = 0; i < buttons.length; i++){
        buttons[i].setBackgroundColor(gui_attrs.color_Z2);
        buttons[i].setLayoutParams(param);
        buttons[i].setOnCheckedChangeListener(this);
    }

    LinearLayout row;
    for(int i = 0; i < buttons.length/2; i++){
        row = new LinearLayout(gui_attrs.context);
        row.setOrientation(LinearLayout.HORIZONTAL);
        row.setBackgroundColor(gui_attrs.color_Z1);
        if(i == 0){
            row.setPadding(0, 0, 0, gui_attrs.padding_Z1/2);
        }else{
            row.setPadding(0, gui_attrs.padding_Z1/2, 0, gui_attrs.padding_Z1/2);
        }

        row.addView(buttons[i*2]);

        TextView tvDiv = new TextView(gui_attrs.context);
        tvDiv.setPadding(gui_attrs.padding_Z1, 0, 0, 0);
        tvDiv.setBackgroundColor(gui_attrs.color_Z1);
        row.addView(tvDiv);

        row.addView(buttons[i*2+1]);
        this.addView(row);
    }
    if(buttons.length%2 > 0){
        row = new LinearLayout(gui_attrs.context);
        row.setBackgroundColor(gui_attrs.color_Z1);
        row.setPadding(gui_attrs.padding_Z1, gui_attrs.padding_Z1/2, gui_attrs.padding_Z1, gui_attrs.padding_Z1/2);

        param = new LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        param.weight = 0.8f;

        TextView tvDiv = new TextView(gui_attrs.context);
        tvDiv.setLayoutParams(param);
        row.addView(tvDiv);

        buttons[buttons.length-1].setGravity(Gravity.CENTER);
        row.addView(buttons[buttons.length-1]);

        tvDiv = new TextView(gui_attrs.context);
        tvDiv.setLayoutParams(param);
        row.addView(tvDiv);

        this.addView(row);
    }

}
@Override
public void onCheckedChanged(CompoundButton view, boolean checked) {
    if(checked){
        for(int i = 0; i < buttons.length; i++){
            if(!buttons[i].equals(view)){
                buttons[i].setChecked(false);
            }else{
                selected = buttons[i];
            }
        }
    }
}
public void createRadioButtons(String[] text, String instruction){
    RadioButton[] buttons = new RadioButton[text.length];
    for(int i = 0; i < text.length; i++){
        buttons[i] = new RadioButton(gui_attrs.context);
        buttons[i].setText(text[i]);
    }
    this.setRadioButtons(buttons, instruction);
}
public String getSelected(){
    return selected.getText().toString();
}

///Failed attempt...
@Override
protected void onFinishInflate (){
    super.onFinishInflate();

    System.out.println("Finnish inflate: " + this.getWidth());
}


}
4

1 に答える 1

1

XML を使用して画面をレイアウトするか、プログラムで行うかは関係ありません。RadioButtons、Texts などは最初にそれらのサイズで配布され、次に結果の空き領域のみが LinearLayout のビュー間で均等に配布されます。

: 2 つのビューを持つ水平方向の LinearLayout があります。最初のビューの幅は 48dip で、2 番目のビューの幅は 12dip です。どちらも同じ重みで、LinearLayout の幅は 96dip です。

例の Androids Layout : 何が起こるかというと、Android は両方のビューに必要なものを提供し、それらの間の空きスペースを として計算します96dip - (48dip+12dip) = 36dip。これで、36dip が= 18dipそれぞれの 2 つのビューに均等に分散されます。各ビューは、独自の幅 + 18dip のスペース内に配置されます。ビューが配置される場所は、 によって異なりますlayout_gravity

LinearLayout 内で均等なサイズのビューが必要な場合は、それらに同じ重みを与え、幅 (水平に分散) または高さ (垂直に分散) を に設定し"0dip"ます。

LinearLayout.LayoutParamsとはいえ、正確にこのように定義する必要があります。あなたの例では、均等なサイズの列のコードは次のとおりです。

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, height, 1f);

widthLinearLayout のすべての使用可能なスペースがビュー間で均等に分散されるように、パラメータが 0 に設定されていることに注意してください。

于 2013-09-17T18:37:27.837 に答える