下课睡觉 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 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 arduino控制ps2手柄一直报错
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 求chat4.0解答一道线性规划题,用lingo编程运行,第一问要求写出数学模型和lingo语言编程模型,第二问第三问解答就行,我的ddl要到了谁来求了
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题