【问题标题】:Add Divider to AlertDialog with CustomView使用 CustomView 将分隔符添加到 AlertDialog
【发布时间】:2023-01-26 18:55:40
【问题描述】:

我想在底部的警告对话框中添加一个分隔符,类似于它在有长列表视图时显示的分隔符(见图)。 但是,我添加了自定义视图,因为我希望能够为整个应用程序中的所有 AlertDialogs 使用通用布局。现在视图和按钮之间有一个非常大的空间。此外,曾经有分隔线(来自原始 AlertDialog 视图)的列表视图不再可用,我的布局有它自己的回收视图。 (因为现在推荐它们。) 我尝试在我的自定义视图中添加一个分隔线,但是这个分隔线绑定到它的父视图的填充,因此不会填充整个对话框(并且仍然与按钮间隔很远)。

所以我基本上想访问警报对话框中的按钮区域,以在此视图的顶部添加分隔线。 (这将是全宽并低于自​​定义视图的填充。)如果 Builder 可以做到这一点,那就太好了,因为我有时使用正负按钮,有时只使用负按钮或只使用正按钮,并自定义所有这些通用布局也将是一项巨大的努力。

这是我的自定义布局(带分隔线)。我正在使用 MaterialAlertDialogBu​​ilder。注意:我可以移除底部的填充以移除空间,但它看起来被砸碎了,分隔线的宽度问题仍然没有解决。

<?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"
    style="@style/AppCompatAlertDialogTheme"
    android:padding="?dialogPreferredPadding"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/alert_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="to"
        android:textAppearance="@style/TFAlertDialogStyle"
        android:textColor="@color/black"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/alert_explanation"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/padding_small"
        android:text="@string/lorem"
        android:textColor="@color/black"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/alert_title"
        tools:visibility="visible" />

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/alert_options"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/padding_small"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/alert_explanation">
        <!--In here will be the options for every alert dialog-->
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/alert_options_recycler"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>
    <View
        android:id="@+id/alertDivider"
        style="@style/Divider"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

目标:

编辑 1:它也应该与正在填充的 recyclerview 一起工作,所以它必须滚动,当前的解决方案让 recyclerview 在填充中消失。还剩 1 1/2 项,但我无法再滚动了。 (图像在 Divider 上没有 marginTop,有边距它实际上也消失了)

解决方案: 如果您没有包含很多项目的滚动回收视图,@shraddha patel 的方法就可以了。然而,如果你有一个,为了避免切断最后的项目,你需要为内容视图使用 LinearLayout 而不是 ConstraintLayout,如这个有点相关的错误报告所示:https://github.com/material-components/material-components-android/issues/1336 但是,如果你在 recyclerview 下面有项目,父布局仍然需要保持约束布局,否则分隔线将在滚动列表中消失。 所以现在对我来说可行的解决方案是:

<?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
        <!--Don't ever refactor that to constraint layout.
        There's some weird magic making it work only with a LinearLayout.-->
        <androidx.appcompat.widget.LinearLayoutCompat
            android:orientation="vertical"
            android:id="@+id/alert_content_view"
            style="@style/AppCompatAlertDialogTheme"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="?dialogPreferredPadding">

            <TextView
                android:id="@+id/alert_title"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="TextView"
                android:textAppearance="@style/TFAlertDialogStyle"
                android:textColor="@color/black"/>

            <TextView
                android:id="@+id/alert_explanation"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/padding_small"
                android:text="@string/desc"
                android:textColor="@color/black"
                tools:visibility="visible" />

            <androidx.constraintlayout.widget.ConstraintLayout
                android:id="@+id/alert_options"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/padding_small">
                <!--In here will be the options for every alert dialog-->
                <androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/alert_options_recycler"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="parent" />
            </androidx.constraintlayout.widget.ConstraintLayout>
        //Some views set to visibility = gone
        </androidx.appcompat.widget.LinearLayoutCompat>

        <View
            android:id="@+id/alertDivider"
            style="@style/Divider"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/alert_content_view" />
    </androidx.constraintlayout.widget.ConstraintLayout>

【问题讨论】:

    标签: android android-alertdialog divider


    【解决方案1】:

    如果您必须使用 ConstraintLayout 布局实现上述 UI,那么您可以使用以下代码,

    <?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="wrap_content">
    
        <androidx.constraintlayout.widget.ConstraintLayout
            style="@style/AppCompatAlertDialogTheme"
            android:padding="?dialogPreferredPadding"
            android:layout_width="match_parent"
            android:id="@+id/csLayout"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_height="wrap_content">
        <androidx.appcompat.widget.AppCompatTextView
            android:id="@+id/alert_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/Title"
            android:textColor="@color/black"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <androidx.appcompat.widget.AppCompatTextView
            android:id="@+id/alert_explanation"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="@string/desc"
            android:textColor="@color/black"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/alert_title"
            tools:visibility="visible" />
    
        <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/alert_options"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/alert_explanation">
            <!--In here will be the options for every alert dialog-->
            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/alert_options_recycler"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />
        </androidx.constraintlayout.widget.ConstraintLayout>
        </androidx.constraintlayout.widget.ConstraintLayout>
        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:layout_marginTop="10dp"
            app:layout_constraintTop_toBottomOf="@+id/csLayout"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            android:background="@color/black" />
    </androidx.constraintlayout.widget.ConstraintLayout>
    

    【讨论】:

    • 如果我的回答对您有帮助,请告诉我。如果是这样,如果您能为我的回答投票,我将不胜感激?如果您仍有疑问,请随时提问?最后它总是关于社区?
    • 你的回答有帮助。但是,它仅在内容不可滚动时才有效。由于 recyclerview 可能会被填满,最后一个选项和分隔线会被砍掉。但这是一个全新的问题,我必须弄清楚。
    • 好的,知道了,让我分享更新后的答案。
    • 还是行不通。 (正如您在更新的问题中看到的那样。)使用了您的布局,但删除了分隔线处的边距顶部。一旦您将其设置为警报对话框中的视图,它就会启动并消失。
    【解决方案2】:

    尝试使用线性布局(复制此代码并尝试)。

    <androidx.cardview.widget.CardView 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="wrap_content"
        android:orientation="vertical"
        app:cardCornerRadius="8dp">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:weightSum="1">
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
    
                android:padding="10dp">
    
                <TextView
                    android:id="@+id/alert_title"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="to"
                    android:textColor="@color/black"
                    android:textSize="20sp"
                    android:textStyle="bold" />
    
                <TextView
                    android:id="@+id/alert_explanation"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="8dp"
                    android:text="loremfgdgdfgdgdgdgdgdgdgdgdgdgdgdgdgdgloremfgdgdfgdgdgdgdgdgdgdgdgdgdgdgdgdg"
                    android:textColor="@color/black"
                    android:textSize="16sp"
                    tools:visibility="visible" />
            </LinearLayout>
    
            <View
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:background="@color/black" />
    
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="right"
                android:layout_marginEnd="20dp"
                android:orientation="horizontal"
                android:padding="8dp">
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="2dp"
                    android:text="Cancel"
                    android:textColor="@color/black"
                    android:textSize="16sp"
                    android:textStyle="bold" />
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="15dp"
                    android:padding="2dp"
    
                    android:text="Ok"
                    android:textColor="@color/black"
                    android:textSize="16sp"
                    android:textStyle="bold"
                    tools:visibility="visible" />
            </LinearLayout>
    
        </LinearLayout>
    
    
    </androidx.cardview.widget.CardView>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      • 1970-01-01
      • 2014-02-24
      相关资源
      最近更新 更多