模拟器 API 22 中未显示安卓网格布局



我有一个应用程序,在运行API 23的实际设备Nexus 6P和运行API 24的模拟6P,5和4上完全按照预期运行,但在运行API 22的模拟Nexus 5和4上GridLayout表现出奇怪的行为。

该应用程序只有一个活动,其中包含以编程方式设置的多个RelativeLayout.VISIBLE&.INVISIBLE。在一个这样的RelativeLayout我有 2 个GridLayout如下。模拟 API 22 时,底部GridLayout不显示,但顶部始终显示,而不显示 API 22、23 或 24。底部GridLayout仅在我将模拟器设置更改为 API 24(尚未尝试 23)时显示。为什么会这样呢?我不认为我在GridLayout上使用任何需要 API 23 或更高版本的东西。此问题意味着我无法在运行API 5的Nexus 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>

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

。我不深入理解细节,但以前版本的 GridLayout 似乎不支持android:layout_columnWeight属性,尽管它确实支持android:layout_width属性。 鉴于您使用"layout_width"(确实存在)将宽度设置为"0dp",然后尝试使用"columnWeight"(不存在)"拉伸"它,小部件保持在 0dp,因此不会显示。

要解决此问题,GridLayout 的"support.v7"版本确实允许您使用"layout_columnWeight",但您必须确保在它前面加上"app"作为前缀,如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"

如果您使用其他标签,例如高程,卡片角半径等,则还有一个更改android:app

最新更新