【问题标题】:View get packed in ConstraintLayout, Views run out of screen in LinearLayout视图在 ConstraintLayout 中打包,在 LinearLayout 中视图超出屏幕
【发布时间】:2020-04-30 01:20:02
【问题描述】:

我正在实现如下所示的注册/登录屏幕

我已经使用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 总结:

  • 垂直链应用于四个最顶部的视图
  • 垂直链样式设置为打包
  • 最后一个文本视图限制在底部和侧面
  • 在视图上设置边距以分隔项目。

问题是当我在手机上运行此程序时,底部的文本视图会像 here 所示那样紧凑。

接下来我尝试了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>

在这种情况下,底部文本视图不可见,如 here 所示。

我的设备分辨率为 720 * 1280 像素。

我想问题出在硬边距上。无论屏幕高度如何,如何使屏幕看起来像上面的草图?使用LinearLayoutConstraintLayout

【问题讨论】:

    标签: android android-layout android-linearlayout android-constraintlayout


    【解决方案1】:

    我建议您使用所有屏幕密度而不是一种,您可以使用著名的库SDP 或遵循android 提供的指南。 Constraintlayout 的第二次使用 Guideline 类。 这是示例代码sn -p 你也可以使用这个。

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

    【讨论】:

    • 感谢您的回答,我知道库,应该有约束布局或其他布局的方式,因为我安装的应用程序在我的手机上看起来不错,屏幕相似。跨度>
    • 我试过你的代码,底部两个文本视图之间有很大的差距
    • 您可以使用 app:layout_constraintVertical_bias 来控制它。
    【解决方案2】:

    实际上我的问题的解决方案是在ConstraintLayout 中使用Guidelines 和Guidelines app:layout_constraintGuide_percentattribute 并将视图限制为指南。

    由于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>
    

    非常感谢 Rehan Sarwar 记得我关于 Guidelines。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      相关资源
      最近更新 更多