0

画面幅に応じてボタンを動的に追加しようとしています。

つまり、ボタンが 6 つある場合は、ボタンが中央に表示され、左の親と右の親に等間隔で表示されるように、それらを適切に配置する必要があります。

これは私が試しているコードですが、結果はありません:

private void btmBarBtns(int position) {

    RelativeLayout rlLayout;
    RelativeLayout.LayoutParams layoutParams;

    int leftMargin = scrWidth/pageCount;

    CommonMethods.getSystemOutput("Left Margin::::"+leftMargin);

    for (int i = 0; i < pageCount; i ++ ) {

        rlLayout = (RelativeLayout) findViewById(R.id.ivBottomBar);

        layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

        layoutParams.leftMargin = leftMargin;

        ib = new ImageButton(this);
        ib.setId(i);
        ib.setLayoutParams(layoutParams);
        ib.setBackgroundResource(R.drawable.white_circle_32x32);

        rlLayout.addView(ib);
        leftMargin = leftMargin + 70;

        if (ib.getId() == position) {
            ib.setBackgroundResource(R.drawable.black_circle_32x32);
        }

    }
}

上記のコードでは、高さ 25 dp、幅 fill_parent の相対レイアウトがあります。ボタンを追加することはできますが、中央に配置されていません。

4

1 に答える 1

1

ImageButtons左右に等間隔で中央揃えしたいだけの場合は、単純にそれらを a でラップしてから、それを親のLinearLayout中央に配置できます。LinearLayoutRelativeLayout

    RelativeLayout rlLayout = (RelativeLayout) findViewById(R.id.parent);
    LinearLayout container = new LinearLayout(this);
    for (int i = 0; i < 5; i++) {
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        ImageButton ib = new ImageButton(this);
        ib.setId(i);
        ib.setLayoutParams(layoutParams);
        ib.setBackgroundResource(R.drawable.ic_launcher);
        container.addView(ib);

        if (ib.getId() == position) {
            ib.setBackgroundResource(R.drawable.black_circle_32x32);
        }
    }
    RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL,
            RelativeLayout.TRUE);
    rlLayout.addView(container, layoutParams);

上記を行うためだけにさらにコードを書きたい場合は、現在のレイアウトを変更して、この要素をアンカーとして追加できます。

<View
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_centerHorizontal="true"
    android:id="@+id/anchor" />

コード内でImageButtons、このアンカーの左右に配置しViewます。

int anchorId = R.id.anchor;     
        int btnsNr = 6; // this is the number of Buttons
        RelativeLayout rlLayout = (RelativeLayout) findViewById(R.id.parent);
        if (btnsNr % 2 != 0) {
            anchorId = 1000;
            btnsNr--;
            ImageButton imgb = new ImageButton(this);
            imgb.setImageResource(R.drawable.shop_open);
            imgb.setId(anchorId);
            RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.WRAP_CONTENT,
                    RelativeLayout.LayoutParams.WRAP_CONTENT);
            rlp.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
            rlLayout.addView(imgb, rlp);
        }
        int whichPart = 1;
        while (whichPart >= 0) {
            int previousId = anchorId;
            for (int i = 0; i < (btnsNr / 2); i++) {
                RelativeLayout.LayoutParams tmp = new RelativeLayout.LayoutParams(
                        RelativeLayout.LayoutParams.WRAP_CONTENT,
                        RelativeLayout.LayoutParams.WRAP_CONTENT);
                if (whichPart == 1) {
                    tmp.addRule(RelativeLayout.LEFT_OF, previousId);
                } else {
                    tmp.addRule(RelativeLayout.RIGHT_OF, previousId);
                }
                ImageButton imgb = new ImageButton(this);
                previousId += whichPart == 1 ? -1 : 1;
                imgb.setId(previousId);
                imgb.setImageResource(R.drawable.shop_open);
                rlLayout.addView(imgb, tmp);
            }
            whichPart--;
        }

ImageButtons画面に収まる(そしてそれらを水平方向に中央に配置する)数を計算したい場合は、言及する必要があります。

于 2012-06-14T10:53:46.753 に答える