Почему компоновка с точки зрения дизайна настолько отличается на реальном устройстве? - PullRequest
1 голос
/ 04 апреля 2019

Я использую Относительный макет и очень смущаюсь, почему макет такой разный: EditText находится так близко от второго счетчика, второй счетчик немного левее, не выровнен над тем, что над ним, хотя они оба имеют одинаковый marginStart; также кнопка должна быть центрирована по горизонтали.

Я читал, что фактический экран телефона может отличаться от вида, который я вижу в Android Studio , но как это влияет на marginStart, который одинаков для этих двух счетчиков ?! Это то, что я делаю неправильно? (Я новичок в разработке с Android Studio). Вот мой xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".QuizzesFragment">


    <Spinner
        android:id="@+id/fragquizzes_spn_courses"
        android:layout_width="286dp"
        android:layout_height="85dp"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_marginStart="71dp"
        android:layout_marginTop="225dp"
        android:entries="@array/courses_array" />

    <Spinner
        android:id="@+id/fragquizzes_spn_departments"
        android:layout_width="286dp"
        android:layout_height="85dp"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_marginStart="71dp"
        android:layout_marginTop="123dp"
        android:entries="@array/depts_array" />

    <Button
        android:id="@+id/fragquizzes_btn_createQuiz"
        android:layout_width="126dp"
        android:layout_height="63dp"
        android:layout_alignBottom="@id/fragquizzes_spn_courses"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginStart="-90dp"
        android:layout_marginTop="22dp"
        android:layout_marginEnd="137dp"
        android:layout_marginBottom="70dp"
        android:text="@string/create_quiz" />

    <EditText
        android:id="@+id/fragquizzes_et_quizname"
        android:layout_width="250dp"
        android:layout_height="64dp"
        android:layout_alignBottom="@+id/fragquizzes_spn_courses"
        android:layout_alignParentStart="true"
        android:layout_alignParentBottom="true"
        android:layout_marginStart="70dp"
        android:layout_marginTop="16dp"
        android:layout_marginBottom="162dp"
        android:ems="10"
        android:inputType="text"
        android:hint="quiz name"/>

</RelativeLayout>

Хотелось бы, чтобы на телефоне было такое же представление или хотя бы что-нибудь подобное? Вот скриншоты:

! [Дизайн] https://imgur.com/a/bGBm4YW

! [Фактическое устройство] https://imgur.com/a/9KaghT4

Ответы [ 3 ]

2 голосов
/ 05 апреля 2019

Причина, по которой ваш макет не отвечает, заключается в том, что вы используете фиксированный размер для своих представлений (android:layout_width="286dp" и android:layout_height="85dp" for example).

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

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

Если вы хотите, чтобы ваш макет реагировал на весь экран, либо не используйте фиксированный размер / используйте фиксированный размер , но создайте 1 макет для каждого размера экрана или, как я думаю, самое простое решение - используйте ConstraintLayout , оно очень простое в использовании, очень быстрое для создания макета и будет реагировать на все размеры экрана.

Вот пример использования constraintLayout с некоторыми рекомендациями для достижения желаемого макета:

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

    <Spinner
        android:id="@+id/some"
        android:layout_width="0dp"
        android:layout_height="30dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toTopOf="@+id/editText"
        app:layout_constraintEnd_toEndOf="@+id/spinner2"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="@+id/spinner2"
        app:layout_constraintTop_toBottomOf="@+id/spinner2" />

    <Spinner
        android:id="@+id/spinner2"
        android:layout_width="395dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        app:layout_constraintBottom_toTopOf="@+id/some"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_chainStyle="spread" />


    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/editText"
        tools:text="button" />

    <EditText
        android:id="@+id/editText"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        app:layout_constraintBottom_toTopOf="@+id/button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/guideline3"
        app:layout_constraintVertical_chainStyle="spread" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.5" />


</androidx.constraintlayout.widget.ConstraintLayout>
0 голосов
/ 05 апреля 2019

Пожалуйста, попробуйте этот код.В этом коде мы используем фиксированную высоту и ширину счетчика, поэтому во всех кадрах он заполняется по размеру.мы используем LinearLayout для установки счетчика, edittext и кнопки на макете исправления.Мы используем android:orientation="vertical", поэтому все поля внутри этого макета отображаются по вертикали.Верхний край прядильщика устанавливается по вашему выбору.Я установил поля left и Right в linearlayout, чтобы все поля автоматически настраивались в соответствии с этим макетом.Я надеюсь, что это очень полезно для разработки макета в соответствии с вашими.Thanku ..

0 голосов
/ 05 апреля 2019

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

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Spinner
        android:id="@+id/fragquizzes_spn_departments"
        android:layout_width="match_parent"
        android:layout_height="85dp"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true"
        android:layout_marginStart="70dp"
        android:layout_marginTop="123dp"
        android:layout_marginEnd="70dp"
        android:entries="@array/depts_array" />

    <Spinner
        android:id="@+id/fragquizzes_spn_courses"
        android:layout_width="match_parent"
        android:layout_height="85dp"
        android:layout_below="@+id/fragquizzes_spn_departments"
        android:layout_alignParentStart="true"
        android:layout_alignParentEnd="true"
        android:layout_marginStart="70dp"
        android:layout_marginTop="20dp"
        android:layout_marginEnd="70dp"
        android:entries="@array/courses_array" />

    <EditText
        android:id="@+id/fragquizzes_et_quizname"
        android:layout_width="match_parent"
        android:layout_height="64dp"
        android:layout_above="@+id/fragquizzes_btn_createQuiz"
        android:layout_alignParentStart="true"
        android:layout_alignParentEnd="true"
        android:layout_marginStart="70dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="70dp"
        android:layout_marginBottom="30dp"
        android:ems="10"
        android:hint="quiz name"
        android:inputType="text" />

    <Button
        android:id="@+id/fragquizzes_btn_createQuiz"
        android:layout_width="126dp"
        android:layout_height="63dp"
        android:layout_alignBottom="@id/fragquizzes_spn_courses"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="70dp"
        android:text="@string/create_quiz" />

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