Android-сетки не отображается в эмуляторе API 22

У меня есть приложение, которое работает точно так, как нужно на реальном устройстве Nexus 6P с API 23 и с эмулированным 6P, 5 и 4 с API 24, но демонстрирует странное поведение по отношению к GridLayout на эмулированном Nexus 5 & 4 работает API 22.

Приложение имеет только одно действие с несколькими RelativeLayoutы, которые установлены программно .VISIBLE & .INVISIBLE, В одном таком RelativeLayout у меня есть 2 GridLayoutS следующим образом. При эмуляции API 22 нижний GridLayout не показывает, но верхний всегда отображается независимо от API 22, 23 или 24. Нижний GridLayout отображается только когда я изменяю настройку эмулятора на API 24 (еще не пробовал 23). Почему это может быть? Я не думаю, что я использую что-либо на GridLayout это требует API 23 или выше. Эта проблема означает, что я не могу установить это приложение на Nexus 5 с API 22 или 21. Спасибо за любые предложения.

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/gameOperations"
    android:visibility="invisible">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/launchDisplay"
        android:gravity="center_horizontal">

        <TextView
            android:text="@string/app_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/launchTitle"
            android:textStyle="normal|bold"
            android:textSize="50dp"
            android:textAlignment="center"
            android:fontFamily="casual"
            android:textColor="@android:color/holo_blue_dark"
            android:layout_marginTop="15dp"
            android:layout_weight="1" />

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:srcCompat="@drawable/brain_orig_crop_500"
            android:id="@+id/launchImage"
            android:scaleType="centerInside"
            android:layout_weight="2" />

        <TextView
            android:text="@string/launchSubtitle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/launchSubtitle"
            android:fontFamily="casual"
            android:textAlignment="center"
            android:textColor="@android:color/holo_blue_dark"
            android:textSize="25dp"
            android:textStyle="normal|bold"
            android:layout_weight="1"
            android:layout_marginTop="15dp" />

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/launchControls"
            android:gravity="center_vertical"
            android:layout_weight="1">

            <Button
                android:text="@string/debug"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/launchSpacerLeft"
                android:layout_weight="1"
                android:background="@color/colourTransparent"
                android:textSize="15dp"
                android:fontFamily="casual"
                android:textAllCaps="false"
                android:visibility="invisible" />

            <Button
                android:text="@string/launchStart"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/launchStart"
                android:textColor="@android:color/holo_green_dark"
                android:textSize="38dp"
                android:textStyle="normal|bold"
                android:onClick="prepareNewGame"
                android:layout_weight="3"
                android:background="@color/colourTransparent"
                android:fontFamily="casual"
                android:textAllCaps="false" />

            <Button
                android:text="@string/layoutNormal"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/launchSpacerRight"
                android:layout_weight="1"
                android:textAllCaps="false"
                android:background="@color/colourTransparent"
                android:fontFamily="casual"
                android:textSize="15dp" />

        </LinearLayout>

    </LinearLayout>

    <GridLayout
        android:layout_width="match_parent"
        android:id="@+id/header"
        android:columnCount="6"
        android:rowCount="4"
        android:layout_height="168dp"
        android:useDefaultMargins="true"
        android:layout_alignParentTop="true">

        <ImageView
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:srcCompat="@drawable/brain_orig_500"
            android:id="@+id/imageBrain"
            android:layout_column="0"
            android:layout_row="0"
            android:layout_rowWeight="1"
            android:layout_rowSpan="4"
            android:layout_columnSpan="6"
            android:layout_columnWeight="1"
            android:layout_gravity="fill"
            android:scaleType="fitCenter" />

        <Button
            android:text="@string/debug"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:id="@+id/debug"
            android:layout_column="2"
            android:layout_row="3"
            android:layout_columnSpan="2"
            android:layout_rowWeight="1"
            android:layout_columnWeight="1"
            android:fontFamily="casual"
            android:textSize="18dp"
            android:textStyle="normal|bold"
            android:textAllCaps="false"
            android:onClick="prepareNewGame"
            android:background="@color/colourTransparent"
            android:layout_gravity="fill"
            android:paddingTop="10dp"
            android:visibility="gone" />

        <TextView
            android:text="@string/blank"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:id="@+id/spacerColumn"
            android:layout_column="0"
            android:layout_columnWeight="1"
            android:layout_columnSpan="2"
            android:layout_gravity="fill"
            android:layout_row="0"
            android:layout_rowSpan="3"
            android:layout_rowWeight="3" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:text="@string/timerDisplay"
            android:id="@+id/timerDisplay"
            android:layout_column="0"
            android:layout_row="3"
            android:layout_columnSpan="2"
            android:layout_rowWeight="1"
            android:layout_columnWeight="1"
            android:fontFamily="casual"
            android:textSize="30dp"
            android:textStyle="normal|bold"
            android:gravity="start"
            android:layout_gravity="fill"
            android:layout_rowSpan="1" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:id="@+id/rightWrongDisplay"
            android:layout_column="2"
            android:layout_row="3"
            android:layout_columnSpan="2"
            android:layout_rowWeight="1"
            android:layout_columnWeight="1"
            android:textAlignment="center"
            android:textStyle="normal|bold"
            android:textSize="28dp"
            android:fontFamily="casual"
            android:layout_gravity="fill"
            android:layout_rowSpan="1"
            android:visibility="gone" />

        <TextView
            android:text="@string/scoreDisplay"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:id="@+id/scoreDisplay"
            android:layout_column="4"
            android:layout_row="3"
            android:layout_columnSpan="2"
            android:layout_rowWeight="1"
            android:layout_columnWeight="1"
            android:fontFamily="casual"
            android:textStyle="normal|bold"
            android:textSize="30dp"
            android:gravity="end"
            android:layout_gravity="fill"
            android:layout_rowSpan="1" />

    </GridLayout>

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:id="@+id/scoreBoard"
        android:layout_alignParentTop="false"
        android:layout_below="@+id/header"
        android:visibility="gone">

    </LinearLayout>

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:id="@+id/question"
        android:layout_below="@+id/scoreBoard"
        android:layout_marginTop="15dp"
        android:gravity="center">

        <TextView
            android:text="@string/operandLeft"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:id="@+id/operandLeft"
            android:layout_weight="5"
            android:textSize="60sp"
            android:fontFamily="casual"
            android:textAlignment="textEnd"
            android:textStyle="normal|bold"
            android:paddingEnd="10dp"
            android:paddingStart="0dp"
            android:layout_gravity="center_vertical|end"
            android:paddingLeft="0dp"
            android:paddingRight="10dp"
            android:visibility="gone" />

        <TextView
            android:text="@string/operator"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:id="@+id/operator"
            android:layout_weight="1"
            android:textAlignment="center"
            android:textStyle="normal|bold"
            android:textSize="60sp"
            android:fontFamily="casual"
            android:visibility="gone" />

        <TextView
            android:text="@string/operandRight"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:id="@+id/operandRight"
            android:layout_weight="5"
            android:textAlignment="textStart"
            android:textStyle="normal|bold"
            android:textSize="60sp"
            android:fontFamily="casual"
            android:paddingStart="10dp"
            android:paddingEnd="0dp"
            android:layout_gravity="center_vertical|start"
            android:paddingLeft="10dp"
            android:paddingRight="0dp"
            android:visibility="gone" />

        <TextView
            android:text="@string/sampleQuestion"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/questionView"
            android:layout_weight="1"
            android:gravity="center"
            android:textSize="60dp"
            android:textStyle="normal|bold"
            android:fontFamily="casual" />

    </LinearLayout>

    <GridLayout
        android:layout_width="match_parent"
        android:layout_height="250dp"
        android:layout_below="@+id/question"
        android:layout_marginTop="10dp"
        android:id="@+id/answers"
        android:rowCount="2"
        android:columnCount="2"
        android:useDefaultMargins="true"
        android:layout_above="@+id/footer">

        <Button
            android:text="@string/answer0"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:id="@+id/answer0"
            android:layout_column="0"
            android:layout_row="0"
            android:layout_rowWeight="1"
            android:layout_columnWeight="1"
            android:onClick="actionAnswer"
            android:textSize="50dp"
            android:textAllCaps="false"
            android:textStyle="normal|bold"
            android:fontFamily="casual"
            android:layout_gravity="fill_horizontal"
            android:background="@color/colourTransparent" />

        <Button
            android:text="@string/answer1"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:id="@+id/answer1"
            android:layout_column="1"
            android:layout_row="0"
            android:layout_rowWeight="1"
            android:layout_columnWeight="1"
            android:onClick="actionAnswer"
            android:textSize="50dp"
            android:textAllCaps="false"
            android:textStyle="normal|bold"
            android:fontFamily="casual"
            android:layout_gravity="fill_horizontal"
            android:background="@color/colourTransparent" />

        <Button
            android:text="@string/answer2"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:id="@+id/answer2"
            android:layout_column="0"
            android:layout_row="1"
            android:layout_rowWeight="1"
            android:layout_columnWeight="1"
            android:layout_gravity="fill_horizontal"
            android:onClick="actionAnswer"
            android:textSize="50dp"
            android:textAllCaps="false"
            android:textStyle="normal|bold"
            android:fontFamily="casual"
            android:background="@color/colourTransparent" />

        <Button
            android:text="@string/answer3"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:id="@+id/answer3"
            android:layout_column="1"
            android:layout_row="1"
            android:layout_rowWeight="1"
            android:layout_columnWeight="1"
            android:layout_gravity="fill_horizontal"
            android:onClick="actionAnswer"
            android:textSize="50dp"
            android:textAllCaps="false"
            android:textStyle="normal|bold"
            android:fontFamily="casual"
            android:background="@color/colourTransparent"  />

    </GridLayout>

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="25dp"
        android:id="@+id/footer"
        android:layout_marginTop="15dp"
        android:gravity="center"
        android:visibility="gone"
        android:layout_alignParentBottom="true">

        <TextView
            android:text="@string/footerText"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/footerText"
            android:layout_weight="1"
            android:gravity="center"
            android:textSize="18sp"
            android:fontFamily="casual" />

    </LinearLayout>
</RelativeLayout>

4 ответа

У меня тоже была именно эта проблема, и я наконец нашел решение, используя android.support.v7.widget.GridLayout вместо просто GridLayout

Я не понимаю деталей глубоко, но предыдущие версии GridLayout, кажется, не поддерживают android:layout_columnWeight собственность, хотя она поддерживает android:layout_width имущество. Учитывая, что вы устанавливаете ширину на "0dp" с помощью "layout_width" (которая существует), а затем пытаетесь "растянуть" ее с помощью "columnWeight" (которая не существует), виджет остается на 0dp и, следовательно, не отображается.

Чтобы обойти это, версия GridLayout "support.v7" позволяет вам использовать "layout_columnWeight", хотя вы должны быть уверены, что добавили префикс "app" вместо "android", как в app:layout_columnWeight = "1", Таким образом, ваш файл макета должен читать:

<android.support.v7.widget.GridLayout
        android:layout_width="match_parent"
        android:id="@+id/header"
        android:columnCount="6"
        android:rowCount="4"
        android:layout_height="168dp"
        android:useDefaultMargins="true"
        android:layout_alignParentTop="true">

    <ImageView
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:srcCompat="@drawable/brain_orig_500"
            android:id="@+id/imageBrain"
            android:layout_column="0"
            android:layout_row="0"
            android:layout_rowWeight="1"
            android:layout_rowSpan="4"
            android:layout_columnSpan="6"
            app:layout_columnWeight="1"
            android:layout_gravity="fill"
            android:scaleType="fitCenter" />

    .
    . 
    .

</android.support.v7.widget.GridLayout>

Критические изменения добавляются android.support.v7.widget. в Gridlayout и меняется android:layout_columnWeight="1" в app:layout_columnWeight="1"

Вам также нужно будет добавить версию gridlauout-v7, которую вы хотите использовать, в раздел зависимостей вашего манифеста. Для меня я добавил:

compile 'com.android.support:gridlayout-v7:26.0.0-alpha1'

И, наконец, если вы хотите включить вес столбца в стиль, то пропустите префикс "app", как в:

<style name="button_digit" parent="button">
    <item name="android:layout_width">0dip</item>
    <item name="layout_columnWeight">1</item>
    .
    .
    .

</style>

Измените GridLayout на androidx.gridlayout.widget.GridLayout, добавив зависимость

      implementation 'androidx.gridlayout:gridlayout:1.0.0'

Изменить следующие атрибуты

      android:rowCount="2"
android:columnCount="2"
android:layout_row="0"
android:layout_columnWeight="1"
android:layout_rowWeight="1"
android:layout_column="0"

К

      app:rowCount="2"
app:columnCount="2"
app:layout_row="0"
app:layout_columnWeight="1"
app:layout_rowWeight="1"
app:layout_column="0"

Альтернативное решение: это будет выглядеть неприятно, но оно работает, даже я не хотел использовать эту технику, но кто-то указал мне, что сохраненная память от неиспользования v7 GridLayout(нет необходимости в дополнительной библиотеке) может стоить использования этого:

в начале действия создайте цикл, который вручную устанавливает высоту и ширину каждой ячейки, как это

  if(imageCell.getMeasuredHeight() == 0){
        DisplayMetrics displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        int height = displayMetrics.heightPixels;
        int width = displayMetrics.widthPixels;
        GridLayout.LayoutParams lp;
        lp = (GridLayout.LayoutParams) imageCell.getLayoutParams();
        lp.height = (int) ((height / 9));
        lp.width = (int) (width / 8);
        imageCell.setLayoutParams(lp);
    }

(редактировать: при условии полноэкранной сетки 8/9)

+ Изменить GridLayout к android.support.v7.widget.GridLayout и добавить

implementation 'com.android.support:gridlayout-v7:28.0.0' 

в app.gradle это сработало для меня

а также заменить

android:columnCount="2"
android:rowCount="2"

Чтобы

app:layout_columnWeight = "2"
app:layout_rowWeight = "2"

а также изменить

android:layout_columnWeight="1"
android:layout_rowWeight="1"

Чтобы

app:layout_columnWeight = "1"
app:layout_rowWeight = "1"

еще один, если вы используете другие теги, такие как Elevation,cardCornerRadius и т. д., измените android: к app