下课睡觉 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里面的绘制在了同一个位置

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 白萝卜。 2017-07-14 09:25
    关注

    一个一个button加 看看哪个出问题了,另外 你这种问题不用自定义view也能实现吧,这样明显变麻烦了。

    评论
  • Lee·陈 2017-07-14 09:29
    关注

    这里会绘制一遍
    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 onDraw(Canvas canvas) {
    super.onDraw(canvas);
    for (Button b : mButtons) {
    b.draw(canvas);
    }
    }
    }

    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 Erasure Code纠删码表
  • ¥15 用vite创建的vue3项目,404重定向不起作用??
  • ¥15 关于#c语言#的问题:一个球从80米高度自由落下,每次落地后反弹的高度为原高度的一半计算6次小球反弹的高度.(反弹结果取整,使用走走for循环结构)
  • ¥15 SurfaceControl的screenshot问题
  • ¥15 基于51单片机的oled菜单代码,要C语言,模块化编程!
  • ¥15 JAVAswing,设计一个扑克牌什么的
  • ¥50 python ctypes调用dll实现分析
  • ¥40 用python解决数据统计问题
  • ¥100 是否有方案能通过抓包分析得到移动应用的名称和包名信息?
  • ¥15 opencv检测不到轮廓