【问题标题】:android gridlayout not showing in emulator API 22android gridlayout 未在模拟器 API 22 中显示
【发布时间】:2017-05-07 14:50:32
【问题描述】:

我有一个应用程序在运行 API 23 的实际设备 Nexus 6P 和运行 API 24 的模拟 6P、5 和 4 上运行完全符合预期,但在模拟 Nexus 5 和 4 运行 API 上显示奇怪行为 wrt GridLayout 22.

该应用只有一个活动,其中包含多个RelativeLayouts,这些活动以编程方式设置.VISIBLE.INVISIBLE。在一个这样的RelativeLayout 中,我有2 个GridLayouts,如下所示。模拟 API 22 时,底部 GridLayout 不显示,但无论 API 22、23 还是 24,顶部总是显示。底部 GridLayout 仅在我将模拟器设置更改为 API 24 时显示(未尝试 23 )。为什么会这样?我不认为我在 GridLayout 上使用任何需要 API 23 或更高版本的东西。这个问题意味着我无法在运行 API 22 或 21 的 Nexus 5 上安装此应用程序。感谢您的任何建议。

<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>

【问题讨论】:

    标签: android android-emulator android-relativelayout android-gridlayout android-api-levels


    【解决方案1】:

    我也遇到过这个问题,我终于找到了解决方案,使用 android.support.v7.widget.GridLayout 而不是 GridLayout

    我不太了解细节,但以前版本的 GridLayout 似乎不支持android:layout_columnWeight 属性,尽管它确实支持android:layout_width 属性。假设您使用“layout_width”(确实存在)将宽度设置为“0dp”,然后尝试使用“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>
    

    【讨论】:

      【解决方案2】:

      通过添加依赖将 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"
      

      【讨论】:

        【解决方案3】:

        替代解决方案:它看起来很讨厌,但它有效,即使我不想使用这种技术,但有人向我指出,不使用 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 网格)

        【讨论】:

          【解决方案4】:

          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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-10-28
            • 2016-12-28
            • 1970-01-01
            • 1970-01-01
            • 2023-04-10
            • 1970-01-01
            • 2016-06-10
            • 2018-09-14
            相关资源
            最近更新 更多