如何从 Java 代码向 android 中的网格布局添加多个相同的自定义视图

How to add more than one same custom view to a grid layout in android from Java code

我正在 android 中学习自定义视图。 我制作了一个自定义视图,带有一个矩形和一个文本。自定义view的代码为:

    public class TileGenerator extends View {

    // rectangle parameters
    private Rect rect = new Rect();
    private Paint rectPaint = new Paint();

    private Integer rectEndX;
    private Integer rectEndY;
    private Integer rectStartX;
    private Integer rectStartY;
    private Integer rectFillColor;


    private Float rectTextStartX;
    private Float rectTextStartY;

    //rectangle text
    private String rectText;
    private Paint rectTextPaint = new Paint();

    public TileGenerator(Context context) {
        super(context);
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    public void setTileTitleText(String rectText) {
        this.rectText = rectText;
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);

        rectEndX = getrectEndX();
        rectEndY = getrectEndY();
        rectStartX = getRectStartX();
        rectStartY = getRectStartY();

        rectTextStartX = rectEndX/4f + rectStartX;
        rectTextStartY = 3.5f * rectEndY/4f + rectStartY;

        rectTextPaint.setTextSize(rectEndY/8);
        rectTextPaint.setColor(Color.BLACK);

        rect.set(rectStartX,rectStartY,rectEndX,rectEndY);
        rectPaint.setColor(getRectFillColor());
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.drawRect(rect, rectPaint);
        canvas.drawText(rectText,rectTextStartX,rectTextStartY,rectTextPaint );
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
    }

    public Integer getrectEndX() {
        return rectEndX;
    }

    public void setrectEndX(Integer rectEndX) {
        this.rectEndX = rectEndX;
    }

    public Integer getrectEndY() {
        return rectEndY;
    }

    public void setrectEndY(Integer rectEndY) {
        this.rectEndY = rectEndY;
    }

    public Integer getRectStartX() {
        return rectStartX;
    }

    public void setRectStartX(Integer rectStartX) {
        this.rectStartX = rectStartX;
    }

    public Integer getRectStartY() {
        return rectStartY;
    }

    public void setRectStartY(Integer rectStartY) {
        this.rectStartY = rectStartY;
    }

    public Integer getRectFillColor() {
        return rectFillColor;
    }

    public void setRectFillColor(Integer rectFillColor) {
        this.rectFillColor = rectFillColor;
    }

    public String getRectText() {
        return rectText;
    }
}

之后我创建了一个空白 activity。我正在用 JAVA 代码做所有事情。 没有XML。然后我尝试将上面的自定义视图添加到 gridview 布局。我想在水平网格视图中添加两个具有不同文本的自定义视图。到目前为止,我的代码如下:

        @Override
    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    GridLayout gridLayout = new GridLayout(this);

    // first custom view        
    CustomRectWithText customRectWithText = new CustomRectWithText(this);
    customRectWithText.setRectEndX(200);
    customRectWithText.setRectEndY(200);

    customRectWithText.setRectStartX(2);
    customRectWithText.setRectStartY(2);

    customRectWithText.setImage(image);

    customRectWithText.setRectText("Text");

    customRectWithText.setRectFillColor(Color.BLUE);

    gridLayout.addView(customRectWithText);

    // second custom view
    CustomRectWithText customRectWithText1 = new CustomRectWithText(this);
    customRectWithText1.setRectEndX(400);
    customRectWithText1.setRectEndY(200);

    customRectWithText1.setRectStartX(200 + 5);
    customRectWithText1.setRectStartY(2);

    customRectWithText1.setTileTitleText("Text 1");

    customRectWithText1.setRectFillColor(Color.GREEN);

    gridLayout.addView(customRectWithText1);
    setContentView(gridLayout);
    }

但我仍然没有在网格视图中得到两个矩形。一次只显示一个矩形。在上述情况下,仅显示第一个自定义视图。

我哪里做错了。 我想要的只是在网格视图中制作一个重复的矩形,其中包含任意大小的不同标签。 这是这样做的方法吗?我的意思是有没有其他办法。

抱歉,我没有足够的回购评论。 但是你为什么不做一个适配器呢? Gridview 的行为与 listView 相同。 使用适配器填充您的网格。 这也是填充 listView 和 gridView 的正确方法。