包含包装内容的相对布局

Relative layout with wrap content

我想自定义 AlertDialog 以具有固定的页眉和可滚动的页脚 RecyclerView。所以我试着用 RelativeLayout 来做,但是如果 RecyclerView 中有很多项目,那么页脚会隐藏在 RecyclerView 下面。然后我将固定高度添加到 RecyclerView,然后如果项目较少,那么 RecyclerView 和页脚之间会有额外的 space。

使用 RelativeLayout:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true"
    android:gravity="center"
android:layout_centerVertical="true">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:id="@+id/main"
        android:orientation="vertical">
        <TextView
           android:text="Add Additional Information"
           android:id="@+id/additionalInfoTitle"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:textSize="16dp"
           android:gravity="center"
           android:textColor="@color/white"
           android:textStyle="bold"
           android:background="@drawable/popupTitle"
           android:padding="@dimen/_10sdp"/>
       <android.support.v7.widget.RecyclerView
           android:id="@+id/additionalDataList"
           android:scrollbars="vertical"
           android:layout_alignParentTop="true"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"/>

        </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:id="@+id/drlBottomMenu"
        android:layout_height="wrap_content"
        android:background="@color/offWhite"
        android:orientation="vertical"
        android:layout_below="@+id/main">
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Continue"
            android:layout_gravity="center"
            android:id="@+id/continueButton"
            style="@style/buttonStyle"
            android:backgroundTint="@color/colorPrimary"
            android:layout_weight="0.5"
            android:textAllCaps="false"
            android:padding="12dp"
            android:layout_marginTop="@dimen/_12sdp"
            android:layout_marginLeft="@dimen/_20sdp"
            android:layout_marginRight="@dimen/_20sdp"
            android:textColor="@color/white"/>
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Cancel"
            android:padding="12dp"
            android:layout_gravity="center"
            android:id="@+id/cancelButton"
            android:textAllCaps="false"
            style="@style/buttonStyle"
            android:backgroundTint="@color/gray"
            android:layout_weight="0.5"
            android:textColor="@color/white"
            android:layout_marginBottom="@dimen/_12sdp"
            android:layout_marginLeft="@dimen/_20sdp"
            android:layout_marginRight="@dimen/_20sdp"
        />
    </LinearLayout>
</RelativeLayout>

使用线性布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/roundedCorner">
  <TextView
        android:text="Add Additional Information"
        android:id="@+id/additionalInfoTitle"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="16dp"
        android:gravity="center"
        android:textColor="@color/white"
        android:textStyle="bold"
        android:background="@drawable/popupTitle"
        android:padding="@dimen/_10sdp"/>
  <android.support.v7.widget.RecyclerView
    android:id="@+id/additionalDataList"
    android:scrollbars="vertical"
    android:layout_alignParentTop="true"
    android:layout_width="fill_parent"
    android:layout_height="match_parent"/>
  <Button
        android:text="Login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/continueButton"
        style="@style/buttonStyle"
        android:backgroundTint="@color/colorPrimary"
        android:layout_marginTop="@dimen/_12sdp"
        android:layout_marginLeft="@dimen/_20sdp"
        android:layout_marginRight="@dimen/_20sdp"
    />
     <Button
        android:text="Cancel"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/cancelButton"
        style="@style/buttonStyle"
        android:backgroundTint="@color/gray"
        android:layout_marginBottom="@dimen/_12sdp"
        android:layout_marginLeft="@dimen/_20sdp"
        android:layout_marginRight="@dimen/_20sdp"
    />
</LinearLayout>

谁能帮我设计这个。 期望的输出应该是:

编辑 使用 constraintlayout 后,我​​得到以下结果:

<android.support.v7.widget.RecyclerView
    android:id="@+id/additionalDataList"
    android:scrollbars="vertical"
    android:layout_alignParentTop="true"
    android:layout_width="fill_parent"
    android:layout_height="match_parent"
 android:layout_marginBottom="height of bottom header"<-------------add this line
/>

or you can use constraintlayout and set height to 0dp so recylerview can take up availabe space

one more option is to use linear layout and set it to wrap content and dynamically inflate views

试试这个

Activity code

import android.app.Dialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import android.view.Gravity;
import android.view.Window;
import android.view.WindowManager;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    RecyclerView additionalDataList;
    ArrayList<String> arrayList = new ArrayList<>();
    DataAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Dialog dialog = new Dialog(this);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.test);

        Window window = dialog.getWindow();
        window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
        window.setGravity(Gravity.CENTER);

        additionalDataList = dialog.findViewById(R.id.additionalDataList);
        additionalDataList.setLayoutManager(new LinearLayoutManager(this));
        additionalDataList.setHasFixedSize(true);

        addDataToList();

        adapter = new DataAdapter(this, arrayList);
        additionalDataList.setAdapter(adapter);

        dialog.show();
    }

    private void addDataToList() {
        for (int i = 0; i < 50; i++) {
            arrayList.add("Item :" + i);
        }
    }
}

layout.test

<android.support.constraint.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="wrap_content">

    <TextView
        android:id="@+id/additionalInfoTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorAccent"
        android:gravity="center"
        android:padding="10dp"
        android:text="Add Additional Information"
        android:textColor="@android:color/white"
        android:textSize="16dp"
        android:textStyle="bold"
        app:layout_constraintBottom_toTopOf="@+id/additionalDataList"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/additionalDataList"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:scrollbars="vertical"
        app:layout_constraintBottom_toTopOf="@+id/drlBottomMenu"
        app:layout_constraintEnd_toEndOf="@id/drlBottomMenu"
        app:layout_constraintHeight_default="wrap"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintHorizontal_chainStyle="packed"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/additionalInfoTitle" />


    <LinearLayout
        android:id="@+id/drlBottomMenu"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/additionalDataList">

        <Button
            android:id="@+id/continueButton"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginLeft="20dp"
            android:layout_marginTop="12dp"
            android:layout_marginRight="20dp"
            android:layout_weight="0.5"
            android:padding="12dp"
            android:text="Continue"
            android:textAllCaps="false"
            android:textColor="@android:color/white"
            app:backgroundTint="@color/colorPrimary" />

        <Button
            android:id="@+id/cancelButton"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginLeft="20dp"
            android:layout_marginTop="12dp"
            android:layout_marginRight="20dp"
            android:layout_weight="0.5"
            android:padding="12dp"
            android:text="Cancel"
            android:textAllCaps="false"
            android:textColor="@android:color/white"
            app:backgroundTint="@android:color/darker_gray" />
    </LinearLayout>

</android.support.constraint.ConstraintLayout>

输出

output when list has few items

output when list has more items

尝试使用 MaterialDialogAlertDialog,然后使用 constrainlayout + guidelines 创建布局。这要容易得多。

尝试像

一样在约束中使用约束
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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.support.constraint.ConstraintLayout
        android:id="@+id/main"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginBottom="8dp"
        android:padding="15dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <TextView
            android:id="@+id/additionalInfoTitle"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="8dp"
            android:background="@android:color/darker_gray"
            android:gravity="center"
            android:padding="10dp"
            android:text="Add Additional Information"
            android:textColor="@android:color/white"
            android:textSize="16dp"
            android:textStyle="bold"
            app:layout_constraintTop_toTopOf="parent" />

        <android.support.v7.widget.RecyclerView
            android:id="@+id/additionalDataList"
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_alignParentTop="true"
            android:layout_marginStart="8dp"
            android:layout_marginLeft="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginRight="8dp"
            android:layout_weight="8"
            android:scrollbars="vertical"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/additionalInfoTitle" />

        <Button
            android:id="@+id/continueButton"
            style="@style/buttonStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginLeft="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginRight="8dp"
            android:backgroundTint="@color/colorPrimary"
            android:text="Login"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/additionalDataList" />

        <Button
            android:id="@+id/cancelButton"
            style="@style/buttonStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginLeft="8dp"
            android:layout_marginTop="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginRight="8dp"
            android:layout_marginBottom="8dp"
            android:backgroundTint="@color/gray"
            android:text="Cancel"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/continueButton" />
    </android.support.constraint.ConstraintLayout>
</android.support.constraint.ConstraintLayout>