Android Activity Layout-Problem только на 1 из 15 тестовых устройств (ImageView) - PullRequest
0 голосов
/ 09 января 2020

Я тестирую новое действие в нашем приложении Android. На всех устройствах, кроме одного, все было хорошо - за исключением Huawei P30 Pro.

Действие довольно простое: в нижней части отображаются ImageView и небольшая строка меню. Перед настройкой изображения отображается ProgressBar (вращающийся круг).

На Huawei P30 Pro все вроде бы работает нормально (появляется ProgressBar, круг вращается, ProgressBar исчезает), но изображение отсутствует становится видимым Если вы перенаправите изображение, нажав кнопку «Применить» в строке меню, изображение будет правильно переадресовано, поэтому оно действительно доступно, просто не отображается в рамках действия.

Мы тестировали ту же версию приложение на нескольких других устройствах (включая Huawei P10, P20, несколько Samsung-телефонов и HT C) и все было в порядке. Но на обоих Huawei 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) и выглядит ли он как это делает (это не нуль), так же как состояние видимости, которое также, кажется, хорошо. Итак, на данный момент, я думаю, что это чисто проблема макета.

1 Ответ

1 голос
/ 10 января 2020

Я настоятельно рекомендую переключиться с LinearLayout на ConstraintLayout. Даже если ваш текущий макет работает на 14 из 15 устройств, высота нижнего меню всегда составляет 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 для более удобного использования с вашим реальным кодом макета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...