0

I'm making a dynamic grid of colored TextViews as to make tiles, since it's dynamic, so I want the gridSize to be able to be changed while it's running, I need to do it programmatically.

The problem is that when I generate the grid's cells in the onCreate method it does nothing [at least this is what I'm guessing since I don't see anything], but when I do it from the onClick attribute of an element in the activity it does it's job [I see the grid perfectly]

This is the onCreate method, the function to create the grid is generateGrid() [I've put the parameters to View v so that I can test wether it doesn't work or it only doesn't work on onCreate]:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        setTheme(Utils.currentTheme);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.duek48);

        generateGrid(new View(this)); //this doesn't work for some reason
    }

This is the method I've created to generate the grid:

    public void generateGrid(View v) {
        TextView previousCell = null; //to attach the current cell to the previous one
        for (int i = 0; i < gridSize * gridSize; i++) {
            ConstraintLayout grid = findViewById(R.id.grid);
            int gapSize = 16; //this needs improvement: it has to be automatic, proportionally inverse to the grid size
            int cellSize = (grid.getHeight() - (gapSize * (gridSize  + 1))) / gridSize;
            TextView gridBackgroundCell = new TextView(this);
            gridBackgroundCell.setId(View.generateViewId());
            gridBackgroundCell.setText("");
            gridBackgroundCell.setBackgroundTintList(ColorStateList.valueOf(Color.rgb(170, 170, 170)));
            gridBackgroundCell.setBackground(getResources().getDrawable(R.drawable.rounded_view));
            grid.addView(gridBackgroundCell);
            //add constraints
            ConstraintLayout.LayoutParams layoutParams = new ConstraintLayout.LayoutParams(cellSize, cellSize);
            if (previousCell == null) {
                layoutParams.topMargin = gapSize;
                layoutParams.topToTop = R.id.grid;
                layoutParams.startToStart = R.id.grid;
            } else {
                if (i % gridSize == 0) {
                    layoutParams.topMargin = gapSize;
                    layoutParams.topToBottom = previousCell.getId();
                    layoutParams.startToStart = R.id.grid;
                } else {
                    layoutParams.topMargin = 0;
                    layoutParams.topToTop = previousCell.getId();
                    layoutParams.startToEnd = previousCell.getId();
                }
            }
            layoutParams.leftMargin = gapSize;
            gridBackgroundCell.setLayoutParams(layoutParams);

            grid.updateViewLayout(gridBackgroundCell, layoutParams);

            previousCell = gridBackgroundCell;
        }
    }

I've realized that when I remove ALL the LayoutParams part [I'll quote it just to make it clear] the text is shown so it works perfectly, even from the onCreate method, but when I put it back it doesn't:

    ConstraintLayout.LayoutParams layoutParams = new ConstraintLayout.LayoutParams(cellSize, cellSize);
    if (previousCell == null) {
        layoutParams.topMargin = gapSize;
        layoutParams.topToTop = R.id.grid;
        layoutParams.startToStart = R.id.grid;
    } else {
        if (i % gridSize == 0) {
            layoutParams.topMargin = gapSize;
            layoutParams.topToBottom = previousCell.getId();
            layoutParams.startToStart = R.id.grid;
        } else {
            layoutParams.topMargin = 0;
            layoutParams.topToTop = previousCell.getId();
            layoutParams.startToEnd = previousCell.getId();
        }
    }
    layoutParams.leftMargin = gapSize;
    gridBackgroundCell.setLayoutParams(layoutParams);
    grid.updateViewLayout(gridBackgroundCell, layoutParams);

It's as if the LayoutParams are having trouble to be set from the onCreate function. If anyone got any suggestions please help :)

2
  • I faced similar issue in past where I am adding views in constraintLayout in runtime. I started dubbuging each addition of view and identify that there were issue with values of ConstraintSet of individual views I am adding. Can you try doing the same. Commented Feb 12, 2024 at 18:55
  • Yeah passed a couple hours printing shit and solved, thanks anyway :) Commented Feb 12, 2024 at 22:01

1 Answer 1

0

The problem was that the int cellSize was negative since the method getHeight(), of a view that has a LAYOUT height and not a real height, appears to return a negative value; as a result, I was setting the layout height of each view to a negative number.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.