下课睡觉 2017-07-14 09:12 采纳率: 16.7%
浏览 1474
已采纳

android 自定义组合控件的问题

我想自定义一个ViewGroup,里面有4个Button,然后让它们在ViewGroup的底部显示出来,就像下图一样的:
图片说明

但是布局的左上角总是会有一个Button,不知道为啥?

 public class TableView extends ViewGroup {
    Button[] mButtons = new Button[4];

    public TableView(Context context) {
        super(context);
        init(context, null, -1);
    }

    public TableView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs, -1);
    }

    public TableView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs, defStyleAttr);
    }

    private void init(Context context, AttributeSet attrs, int defStyleAttr) {
        setWillNotDraw(false);
        LayoutParams l;
        for (int i = 0; i < mButtons.length; i++) {
            mButtons[i] = new Button(context);
            l = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            mButtons[i].setLayoutParams(l);
        }
        mButtons[0].setText("首页");
        mButtons[1].setText("上一页");
        mButtons[2].setText("下一页");
        mButtons[3].setText("尾页");
        addView(mButtons[0]);
        addView(mButtons[1]);
        addView(mButtons[2]);
        addView(mButtons[3]);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        for (Button b : mButtons) {
            final LayoutParams lp = b.getLayoutParams();
            final int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
                    0, lp.height);
            final int childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec,
                    0,
                    lp.width);
            b.measure(childHeightMeasureSpec, childWidthMeasureSpec);
        }
    }


    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        int totalButtonWidth = 0;
        for (Button bt : mButtons) {
            totalButtonWidth += bt.getMeasuredWidth();
        }
        int left = (r - l - totalButtonWidth) / 2;

        for (Button bt : mButtons) {
            bt.layout(left, b - bt.getMeasuredHeight(), left + bt.getMeasuredWidth(), b);
            left += bt.getMeasuredWidth();
        }
    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        for (Button b : mButtons) {
            b.draw(canvas);
        }
    }
}
  • 写回答

3条回答 默认 最新

  • Lee·陈 2017-07-14 09:31
    关注

    你不是多出来一个 而是多绘制了一遍 只不过 onDraw里面的绘制在了同一个位置

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 chaquopy python 安卓
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 有没有帮写代码做实验仿真的
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥30 vmware exsi重置后登不上
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题