0

レイアウト内に2つのボタンが並んでいます。私はそれらが同じ幅を持つことを望みます。ただし、すべてのボタンの幅は、それらの最も広い幅に等しくする必要があります。今私はViewTreeObserverを使用しています。

    class LayoutListener implements ViewTreeObserver.OnGlobalLayoutListener{
    private Button btn1, btn2;

    public LayoutListener(Button b1, Button b2){
        btn1 = b1; btn2 = b2;
    }
    @Override
    public void onGlobalLayout() {
        int w1 = btn1.getWidth();
        int w2 = btn2.getWidth();
        if (w1 < w2)
            btn1.setWidth(w2);
        else
            btn2.setWidth(w1);
    }
}

しかし、要素がユーザーに表示された後に再描画され、見栄えが悪いため、これは良い決定ではありません。ご想像のとおり、必要な動作に到達するにはどうすればよいでしょうか? マークアップを操作する方法はありますか、それとも特別なコードを実装する必要がありますか? ボタンのコンテナーとして使用できるカスタム レイアウトを作成することは避けることが望ましいです。

4

2 に答える 2

0

インフレ後に直接呼び出すgetWidthと、常に0が返されます。サイズを取得する前にそれを防ぐには、measure関数を使用して測定プロセスを開始する必要があります。これは私のコードです(しかし、それが最善かつ最速の方法であるかどうかはわかりません))):

....
view = inflator.inflate(R.layout.send_command_item, null);
btnOff = (Button)view.findViewById(R.id.btnOff);
btnOn = (Button)view.findViewById(R.id.btnOn);
set_w(btnOff, btnOn);
.....

public void set_w(Button btn1, Button btn2) {
    btn1.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    btn2.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    int w1 = btn1.getMeasuredWidth();
    int w2 = btn2.getMeasuredWidth();
    if (w1 < w2)
        btn1.setWidth(w2);
    else
        btn2.setWidth(w1);
}
于 2012-07-10T20:54:54.447 に答える
0

アクティビティの onCreate() メソッドでボタンの幅を比較して設定できますか、それとも別の時間にサイズを変更する必要がありますか?

編集:

ビューをインフレートした後、2 つの Button 変数を作成(Button)yourViewName.findViewById(R.id.buttonid);し、それらをバインドするために使用できます。その後、 getWidth() と setWidth() を使用して、必要に応じてそれらを比較および変更できます。

于 2012-06-11T23:07:56.967 に答える