Android Activity 15 个测试设备中只有 1 个存在布局问题 (ImageView)

Android Activity Layout-Problem on only 1 of 15 test-devices (ImageView)

我正在 Android 应用程序中测试新的 activity。在除一台设备外的所有设备上,一切都很好 - 除了华为 P30 Pro。

activity 非常简单:它在底部显示一个 ImageView 和一个小菜单栏。在设置图像之前,会显示一个 ProgressBar(旋转的圆圈)。

在Huawei P30 Pro上,似乎一切正常(ProgressBar出现,圆圈旋转,ProgressBar消失),但没有图像可见。如果您通过按菜单栏中的应用按钮转发图像,图像会正确转发,因此它实际上是可用的,它只是没有在 activity.

中显示

我们在其他几台设备(包括华为 P10、P20、几款三星手机和 HTC)上测试了相同版本的应用程序,一切正常。但是在我们手头的两款华为P30 Pro上,都出现了同样的问题。

布局代码非常简单:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical"
              android:layout_weight="10">

    <LinearLayout
            android:layout_height="0dp"
            android:layout_width="fill_parent"
            android:layout_weight="9"
            android:orientation="vertical">

        <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">

            <ImageView
                    android:id="@+id/imageView"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    tools:srcCompat="@tools:sample/avatars"
                    android:contentDescription="Image preview"/>

            <ProgressBar
                    android:id="@+id/indeterminateBar"
                    android:indeterminate="true"
                    android:minWidth="100dp"
                    android:minHeight="100dp"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerHorizontal="true"
                    android:layout_centerInParent="true"
                    />
        </RelativeLayout>

    </LinearLayout
            android:layout_height="0dp">

    <LinearLayout
            android:layout_height="0dp"
            android:layout_width="fill_parent"
            android:layout_weight="1">
    <!-- bottom menu-bar-code is here as a TableLayout, which works fine on all devices -->
    </LinearLayout>
</LinearLayout>

也许 ImageView 的高度为 0,所以它不可见? 我对它可能是什么感到困惑,因为它只是那个特定的设备...

我检查了 ImageView-drawable 是否正确设置了 (imageView.getDrawable() != null) 并且看起来确实如此(它不是 null),以及可见性状态,这好像也还好。 所以在这一点上,我认为这是一个纯粹的布局问题。

我强烈建议从 LinearLayout 切换到 ConstraintLayout。即使您当前的布局适用于 15 台设备中的 14 台,底部菜单的高度始终为 10%,这在高度较小的设备上看起来不太好(您是否尝试过横向布局?您会明白我的意思) .

切换到 ConstraintLayout 后,您在第 15 台设备上的布局问题应该也会消失。

我将您的布局转换为使用 ConstraintLayout 来展示它的外观。里面的布局也比较少。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:contentDescription="Image preview"
        app:layout_constraintBottom_toTopOf="@id/bottomMenuBar"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:srcCompat="@tools:sample/avatars" />

    <ProgressBar
        android:id="@+id/indeterminateBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:indeterminate="true"
        android:minWidth="100dp"
        android:minHeight="100dp"
        app:layout_constraintBottom_toTopOf="@+id/bottomMenuBar"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <LinearLayout
        android:id="@+id/bottomMenuBar"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent">
        <!-- bottom menu-bar-code is here as a TableLayout, which works fine on all devices -->
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

请注意,出于在布局预览中的可见性原因,我为底部菜单的 LinearLayout 添加了固定高度。一旦您了解了 ConstraintLayout,您还应该为菜单栏更改它。我将其保留为 LinearLayout,以便更轻松地与您的实际布局代码一起使用。