下课睡觉 2017-07-14 09:12 采纳率: 14.3%
浏览 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 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵