Почему этот макет работает в режиме предварительного просмотра, но не работает на моем устройстве?

Я разрабатываю приложение для Android для школы. Макет, который я разработал, выглядит хорошо для меня в предварительном просмотре Android Studio, но как только я развертываю его на своем физическом устройстве (HTC One m8, Android 5.0.1), все внутри карты искажается.

Файл макета:

<?xml version="1.0" encoding="utf-8"?>
<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="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="de.seschi98.trgapp.activities.ScheduleActivity"
    tools:showIn="@layout/activity_schedule">



    <android.support.v7.widget.CardView
        android:id="@+id/card_view"
        android:layout_width="match_parent"
        android:layout_height="120dp">


        <GridLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:columnCount="4"
            android:rowCount="1"
            android:columnOrderPreserved="false"
            android:orientation="horizontal"
            android:rowOrderPreserved="false">

            <TextView
                android:id="@+id/lesson_number"
                android:text="01"
                android:textSize="22dp"
                android:layout_width="wrap_content"
                android:layout_column="0"
                android:layout_row="0"
                android:layout_rowWeight="1"
                android:gravity="center_vertical|center_horizontal"
                android:textStyle="bold"
                android:layout_columnWeight="20" />

            <GridLayout
                xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_column="1"
                android:layout_row="0"
                android:columnCount="2"
                android:layout_columnWeight="90"
                android:rowCount="3"
                android:layout_height="match_parent">


                <TextView
                    android:gravity="center_vertical|center_horizontal"
                    android:id="@+id/lesson_name"
                    android:text="Chemistry"
                    android:textSize="22dp"
                    android:layout_height="wrap_content"
                    android:layout_column="1"
                    android:layout_row="0"
                    android:layout_rowWeight="15"
                    android:layout_gravity="center_horizontal"
                    android:paddingTop="10dp"
                    android:layout_width="match_parent" />

                <TextView
                    android:gravity="bottom|center_horizontal"
                    android:id="@+id/teacher"
                    android:text="Mr Smith"
                    android:layout_height="wrap_content"
                    android:textSize="16dp"
                    android:layout_column="1"
                    android:layout_row="1"
                    android:layout_rowWeight="20"
                    android:layout_gravity="center_horizontal"
                    android:layout_width="match_parent" />


                <TextView
                    android:gravity="top|center_horizontal"
                    android:id="@+id/room"
                    android:text="Room A-123"
                    android:textSize="16dp"
                    android:layout_height="wrap_content"
                    android:layout_column="1"
                    android:layout_row="2"
                    android:layout_rowWeight="20"
                    android:layout_gravity="center_horizontal"
                    android:layout_width="match_parent" />


            </GridLayout>

            <View android:layout_row="0"
                android:layout_column="2"
                android:layout_height="match_parent"
                android:layout_width="0dp"
                android:layout_columnWeight="15">

            </View>

            <View android:layout_row="0"
                android:id="@+id/badge"
                android:layout_column="3"
                android:layout_height="match_parent"
                android:layout_width="0dp"
                android:background="#c0392b"
                android:layout_columnWeight="5">

            </View>


        </GridLayout>

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

</LinearLayout>

Снимок экрана предварительного просмотра

Снимок экрана устройства (не имеет значения панель действий или другие элементы, это только CardView ...)

// Обновление: вчера я обновил свою версию Android до 6.0.0 Marshmallow, теперь она работает нормально. Но я включил AppCompat... Что может быть причиной того, что он не работает на предыдущих версиях Android?


person seschi98    schedule 26.01.2016    source источник
comment
Вы проверяли это на любом другом устройстве или эмуляторе?   -  person Shishram    schedule 26.01.2016
comment
Та же проблема на моем планшете Samsung с Android 5.0.2...   -  person seschi98    schedule 26.01.2016


Ответы (4)


Неважно, это была ошибка версии:

После некоторого тестирования я понял, что мне нужно изменить <GridLayout> в моем файле макета на <android.support.v7.widget.GridLayout>. Не думал об этом, потому что думал, что GridLayout будет совместим с Android 5...

Так что теперь он отлично работает на всех моих устройствах, как на Android 5, так и на Android 6. Хотя мне это не очень помогло, спасибо за быстрые ответы!

person seschi98    schedule 01.02.2016
comment
Это решило проблему для меня - спасибо. Однако, чтобы иметь возможность использовать атрибуты сетки, такие как app:columnCount="2", мне также нужно установить это: xmlns:app="http://schemas.android.com/apk/lib/android.support.v7.widget.GridLayout" - person Gene Bo; 06.10.2017

Предварительный просмотр в студии Android иногда отличается от вашего устройства, убедитесь, что установлен тот же размер экрана вашего телефона, что и предварительный просмотр в студии Android.

person Kenny Jay Jaudian    schedule 26.01.2016
comment
Я не верю, что это размер экрана, потому что я использую веса столбцов и строк, чтобы они соответствовали размеру экрана... - person seschi98; 26.01.2016
comment
@seschi98 - это не бутстрап :) - person ʍѳђઽ૯ท; 26.01.2016
comment
@LinX64 LinX64 да, я знаю, но я думал, что установка ширины gridLayout на match_parent (так сказать, 100%) и определение весов для дочерних элементов поможет сделать его более отзывчивым. - person seschi98; 26.01.2016
comment
попробуйте объявить отступы и поля макета - person Kenny Jay Jaudian; 27.01.2016

Кенни уже дал вам ответ.

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

Вы можете добавить указанный макет для размера экрана. Но вы должны понимать, что Android работает на огромном количестве устройств и размеров экрана. У вас всегда будут проблемы с некоторыми экранами, возможно, сосредоточение внимания на небольших проблемах дизайна — не лучший путь.

Проверьте эти ссылки:

Android и поддержка макетов нескольких экранов

Распространение экранов

ИЗМЕНИТЬ:

Если у вас одна и та же проблема в каждом устройстве, то, вероятно, дело не в том, о чем мы уже рассказали. Позвольте мне еще немного проверить ваш код, и я скажу вам кое-что еще.

person Sergi Barjola    schedule 26.01.2016
comment
Но я работаю с весами и не устанавливаю никаких статических значений ширины/высоты.... Я не понимаю, почему это должно иметь значение... - person seschi98; 26.01.2016

Выравнивание имеет значение, у меня тоже была такая же проблема. Я устанавливал только одно свойство paddingLeft, но на некоторых устройствах оно не будет работать, поэтому мне пришлось указать оба свойства paddingStart и paddingLeft в стилях-

<item name="android:paddingLeft">@dimen/drawable_icon_padding_left</item>
<item name="android:paddingStart">@dimen/drawable_icon_padding_left</item>

Поэтому убедитесь, что вы используете оба свойства в макете или в стилях. Удачного кодирования :-)

person Bajrang Hudda    schedule 05.12.2017