Заполнение GridLayout из кода не дает тот же результат, что и XML - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь повторить следующее XML в коде:

<GridLayout
    android:id="@+id/row2Grid"
    android:layout_row="1"
    android:layout_column="0"
    android:layout_rowWeight="40"

    android:layout_width="match_parent"
    android:layout_height="wrap_content"

    android:alignmentMode="alignMargins"
    android:columnCount="3"
    android:columnOrderPreserved="true"
    android:padding="0px"
    android:rowCount="2"
    >

    <!-- Box 1 -->
    <androidx.cardview.widget.CardView
        app:cardBackgroundColor="#00ff00"
        android:layout_width="0dp"
        android:layout_height="0dp"

        android:layout_rowWeight="8"
        android:layout_column="0"
        android:layout_columnWeight="6"

        android:layout_marginRight="3dp"
        android:layout_marginBottom="3dp">

    </androidx.cardview.widget.CardView>

    <!-- Box 2 -->
    <androidx.cardview.widget.CardView
        app:cardBackgroundColor="#ff0000"
        android:layout_width="0dp"
        android:layout_height="0dp"

        android:layout_rowWeight="8"
        android:layout_column="1"
        android:layout_columnWeight="6"

        android:layout_marginRight="3dp"
        android:layout_marginBottom="3dp"
        app:cardElevation="8dp">

    </androidx.cardview.widget.CardView>

</GridLayout>

Вышеприведенное выглядит так, что я и хочу:

XML result

Прежде всего GridLayout с идентификатором row2Grid останется как XML. Однако Box 1 и Box 2 не будут, поэтому они должны генерироваться кодом и добавляться к row2Grid динамически

Для этого я создал эту функцию, которая вызывается дважды внутри функции onCreate MainActivity:

@ Переопределить защищенный void onCreate (Bundle saveInstanceState) {... generateBox ("# ff0000"); generateBox ( "# 00ff00"); ...}

public void generateBox(String colorStr) {

    gridLayout = findViewById(R.id.row2Grid);

    int row2children = gridLayout.getChildCount();

    CardView cardView = new CardView(ctx);
    cardView.setBackgroundColor(Color.parseColor(colorStr));
    GridLayout.LayoutParams cardViewLayoutParams = new GridLayout.LayoutParams(GridLayout.spec(0), GridLayout.spec(row2children));
    cardViewLayoutParams.columnSpec = GridLayout.spec(0,8.0f);
    cardViewLayoutParams.rowSpec = GridLayout.spec(0,8.0f);
    cardViewLayoutParams.height = 0;
    cardViewLayoutParams.width= 0;
    cardViewLayoutParams.setMargins(0,0, 12, 34);

    gridLayout.addView(cardView, cardViewLayoutParams);
    gridLayout.invalidate();
    gridLayout.requestLayout();

}

Но это не работает и дает только следующий результат:

Code result

Что я делать неправильно?

1 Ответ

0 голосов
/ 07 марта 2020

Вы знаете, когда вы часами боролись с проблемой, а потом, как только вы задаете вопрос, вы видите решение для себя?

Я увидел решение, как только отправил вопрос. Это, конечно, вызвано тем, что я сначала делаю это:

GridLayout.LayoutParams cardViewLayoutParams = new GridLayout.LayoutParams(GridLayout.spec(0), GridLayout.spec(row2children));
cardViewLayoutParams.columnSpec = GridLayout.spec(0,8.0f);
cardViewLayoutParams.rowSpec = GridLayout.spec(0,8.0f);

Когда я создаю cardViewLayoutParams, я указываю атрибут строки и столбца cardView в конструкторе, но переопределяю их прямо под ним. Изменив это на следующее:

GridLayout.LayoutParams cardViewLayoutParams = new GridLayout.LayoutParams();
cardViewLayoutParams.columnSpec = GridLayout.spec(row2children,8.0f);
cardViewLayoutParams.rowSpec = GridLayout.spec(0,8.0f);

Заставляет все работать как положено

...