Просмотр упакован в ConstraintLayout, представления выходят за пределы экрана в LinearLayout - PullRequest
0 голосов
/ 13 января 2020

Я использую экран регистрации / входа в систему, как показано ниже

enter image description here

Я пробовал использовать 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"
    android:layout_margin="16dp"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/img"
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:layout_marginBottom="72dp"
        android:src="@drawable/ic_launcher_background"
        app:layout_constraintBottom_toTopOf="@+id/btn1"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_chainStyle="packed" />

    <Button
        android:id="@+id/btn1"
        android:layout_width="0dp"
        android:layout_height="56dp"
        android:layout_marginStart="32dp"
        android:layout_marginEnd="32dp"
        android:layout_marginBottom="12dp"
        android:text="Button 1"
        app:layout_constraintBottom_toTopOf="@+id/btn2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/img" />

    <Button
        android:id="@+id/btn2"
        android:layout_width="0dp"
        android:layout_height="56dp"
        android:layout_marginBottom="48dp"
        android:text="Button 2"
        app:layout_constraintBottom_toTopOf="@+id/txt_already_member"
        app:layout_constraintEnd_toEndOf="@+id/btn1"
        app:layout_constraintStart_toStartOf="@+id/btn1"
        app:layout_constraintTop_toBottomOf="@+id/btn1" />

    <TextView
        android:id="@+id/txt_already_member"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Already Member? Sign In"
        android:textSize="16sp"
        app:layout_constraintBottom_toTopOf="@+id/txt_agreement"
        app:layout_constraintEnd_toEndOf="@+id/btn2"
        app:layout_constraintStart_toStartOf="@+id/btn2"
        app:layout_constraintTop_toBottomOf="@+id/btn2" />

    <TextView
        android:id="@+id/txt_agreement"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="By continuing you agree to our terms and privacy policy"
        android:layout_marginTop="32dp"
        android:textSize="12sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Сводка XML:

  • Вертикальная цепочка применяется к четырем самым верхним видам
  • Для стиля вертикальной цепочки задано значение
  • последний вид текста ограничение для нижних и боковых сторон
  • поле установлено для видов для отдельных элементов.

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

Далее я попробовал LinearLayout как показано ниже

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:gravity="center_horizontal"
    android:layout_margin="16dp"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/img"
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:layout_marginBottom="72dp"
        android:layout_marginTop="72dp"
        android:src="@drawable/ic_launcher_background"/>

    <Button
        android:id="@+id/btn1"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:layout_marginStart="32dp"
        android:layout_marginEnd="32dp"
        android:layout_marginBottom="8dp"
        android:text="Button 1" />

    <Button
        android:id="@+id/btn2"
        android:layout_width="match_parent"
        android:layout_marginStart="32dp"
        android:layout_marginEnd="32dp"
        android:layout_height="56dp"
        android:layout_marginBottom="32dp"
        android:text="Button 2" />

    <TextView
        android:id="@+id/txt_already_member"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Already Member? Sign In"
        android:textSize="16sp"
        android:layout_weight="1"/>

    <TextView
        android:id="@+id/txt_agreement"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="By continuing you agree to our terms and privacy policy "
        android:textSize="12sp"/>
</LinearLayout>

В этом случае нижние текстовые представления не видны, как показано здесь .

Разрешение моего устройства составляет 720 * 1280 пикселей.

Полагаю, проблема в жестких полях. Как сделать экран похожим на рисунок выше, независимо от высоты экрана? используя LinearLayout или ConstraintLayout?

Ответы [ 2 ]

0 голосов
/ 13 января 2020

На самом деле решением моей проблемы является использование Guideline s в ConstraintLayout с атрибутом Guideline s app:layout_constraintGuide_percent и ограничение представлений в соответствии с Руководящими принципами.

Поскольку значение для app:layout_constraintGuide_percent является значением в процентах , а не dp, оно работает быстро, независимо от ширины / высоты экрана.

пример:

<?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"
    android:layout_margin="16dp"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/img"
        android:layout_width="250dp"
        android:layout_height="200dp"
        android:src="@drawable/ic_launcher_background"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/guideline4" />

    <Button
        android:id="@+id/btn1"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:layout_marginStart="20dp"
        android:layout_marginEnd="20dp"
        android:text="Button 1"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/guideline5" />

    <Button
        android:id="@+id/btn2"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:layout_marginTop="8dp"
        android:layout_marginStart="20dp"
        android:layout_marginEnd="20dp"
        android:text="Button 2"
        app:layout_constraintEnd_toEndOf="@+id/btn1"
        app:layout_constraintStart_toStartOf="@+id/btn1"
        app:layout_constraintTop_toBottomOf="@+id/btn1" />

    <TextView
        android:id="@+id/txt_already_member"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:layout_marginBottom="16dp"
        android:text="Already Member? Sign In"
        android:textSize="16sp"
        app:layout_constraintBottom_toTopOf="@+id/txt_agreement"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btn2" />

    <TextView
        android:id="@+id/txt_agreement"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="By continuing you agree to our terms and privacy policy "
        android:textSize="12sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

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

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


</androidx.constraintlayout.widget.ConstraintLayout>

Большое спасибо, Рехан Сарвар, что вспомнили меня о Guideline с.

0 голосов
/ 13 января 2020

Я бы порекомендовал вам использовать все плотности экрана, а не одну, для этого вы можете использовать знаменитую библиотеку SDP или следовать указаниям android. Второй класс Guideline для 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="16dp">

<ImageView
    android:id="@+id/img"
    android:layout_width="@dimen/_200sdp"
    android:layout_height="@dimen/_200sdp"
    android:layout_marginTop="16dp"
    android:src="@drawable/ic_launcher"
    app:layout_constraintBottom_toTopOf="@+id/btn1"
    app:layout_constraintEnd_toStartOf="@+id/right"
    app:layout_constraintHorizontal_bias="0.5"
    app:layout_constraintStart_toStartOf="@+id/left"
    app:layout_constraintTop_toTopOf="parent" />

<Button
    android:id="@+id/btn1"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="Button 1"
    app:layout_constraintBottom_toTopOf="@+id/btn2"
    app:layout_constraintEnd_toStartOf="@+id/right"
    app:layout_constraintHorizontal_bias="0.5"
    app:layout_constraintStart_toStartOf="@+id/left"
    app:layout_constraintTop_toBottomOf="@+id/img" />

<Button
    android:id="@+id/btn2"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="Button 2"
    app:layout_constraintBottom_toTopOf="@+id/txt_already_member"
    app:layout_constraintEnd_toStartOf="@+id/right"
    app:layout_constraintHorizontal_bias="0.5"
    app:layout_constraintStart_toStartOf="@+id/left"
    app:layout_constraintTop_toBottomOf="@+id/btn1" />

<TextView
    android:id="@+id/txt_already_member"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:text="Already Member? Sign In"
    android:textSize="16sp"
    app:layout_constraintBottom_toTopOf="@+id/divider"
    app:layout_constraintEnd_toStartOf="@+id/right"
    app:layout_constraintHorizontal_bias="0.5"
    app:layout_constraintStart_toStartOf="@+id/left"
    app:layout_constraintTop_toBottomOf="@+id/btn2" />

<TextView
    android:id="@+id/txt_agreement"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="24dp"
    android:text="By continuing you agree to our terms and privacy policy"
    android:textSize="12sp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toStartOf="@+id/right"
    app:layout_constraintStart_toStartOf="@+id/left"
    app:layout_constraintTop_toTopOf="@+id/divider"
    app:layout_constraintVertical_bias="1.0" />

<androidx.constraintlayout.widget.Guideline
    android:id="@+id/left"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:layout_constraintGuide_begin="@dimen/_16sdp" />

<androidx.constraintlayout.widget.Guideline
    android:id="@+id/right"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:layout_constraintGuide_end="@dimen/_16sdp" />

<androidx.constraintlayout.widget.Guideline
    android:id="@+id/divider"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintGuide_percent="0.7"
    app:layout_constraintTop_toBottomOf="@+id/txt_already_member" />

...