Как установить собственный макет для AlertDialog? - PullRequest
2 голосов
/ 17 июня 2020

Вызов моего диалога:

alertDialog = showInfoDialog(message = "$wrongPasscodeMessage\n$retryMessage")

А вот метод:

fun FragmentActivity.showInfoDialog(message: String?): AlertDialog? {
    return try {
        val customLayout = layoutInflater.inflate(R.layout.custom_layout, null)
        AlertDialog.Builder(this)
            .setView(customLayout)
            .setMessage(message)
            .setCancelable(false)
            .show()
    } catch (e: java.lang.Exception) {
        e.log()
        null
    }
}

А вот мой собственный макет:

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView 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:background="@color/red"
    android:paddingStart="@dimen/dp_44"
    android:paddingEnd="@dimen/dp_44"
    app:cardCornerRadius="@dimen/dp_12" />

Но я не Не знаю, почему у моего диалога нет красного фона и закругленных углов? Что мне не хватает?

ОБНОВЛЕНИЕ: Например, если я изменяю свой custom_layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/red" >

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="350dp"
        android:scaleType="centerCrop"
        android:adjustViewBounds="true"
        android:src="@drawable/googleg_disabled_color_18"/>
</LinearLayout>

, я получаю что-то вроде этого: enter image description here

Но я хочу что-то вроде этого

enter image description here

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Вам не нужен CardView, чтобы получить AlertDialog с закругленными углами: просто используйте стандартный конструктор:

 new MaterialAlertDialogBuilder(this, R.style.DialogOverlay)
                .setMessage("Wrong Passcode\nTry again in 5 minutes")
                .show();

с настраиваемым наложением темы для центрирования сообщения:

<style name="DialogOverlay" parent="@style/ThemeOverlay.MaterialComponents.MaterialAlertDialog">
    <item name="materialAlertDialogBodyTextStyle">@style/BodyText</item>    
</style>

<style name="BodyText" parent="MaterialAlertDialog.MaterialComponents.Body.Text">
    <item name="android:gravity">center_horizontal</item>
</style>

enter image description here

Если вы хотите изменить закругленные углы, просто добавьте shapeAppearanceOverlay в оверлей вашей темы:

<style name="DialogOverlay" parent="@style/ThemeOverlay.MaterialComponents.MaterialAlertDialog">
    ...
    <item name="shapeAppearanceOverlay">@style/DialogCorners</item>    
</style>

<style name="DialogCorners">
    <item name="cornerFamily">rounded</item>
    <item name="cornerSize">12dp</item>
</style>

enter image description here

1 голос
/ 17 июня 2020

Создайте вытягиваемый xml чего-то вроде этого:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/colorPrimary"/>
    <corners android:radius="20dp" />
</shape>

Радиус в форме обеспечивает ваши закругленные углы. Теперь вы можете установить эту возможность рисования в качестве фона для своего LinearLayout для диалога или использовать собственный <style> в своем res/styles.xml:

<style name="CustomAlertDialog" parent="Theme.AppCompat.DayNight.Dialog.Alert">
        <item name="android:windowBackground">@drawable/dialog_background</item>
        <item name="textAllCaps">false</item>
</style>

и использовать этот стиль в своем AlertDialog.Builder:

AlertDialog.Builder(this, R.style.CustomAlertDialog).setView(...

Использование стиля позволяет легко использовать форму последовательно во всех ваших диалогах в приложении.

...