Увеличьте расстояние между заголовком и текстом AlertDialog в Compose

#android #android-layout #android-jetpack-compose #android-dialog #spacing

Вопрос:

В простом AlertDialog виде, как показано ниже

 AlertDialog(
    modifier = Modifier,
    title = {
        Text(text = "Title")
    },
    text = {
        Column(
            modifier = Modifier.fillMaxWidth()
        ) {
            TextButton() {
                Text("Text 1")
            }
            TextButton() {
                Text("Text 2")
            }
        }
    },
    confirmButton = {},
    dismissButton = {}
)
 

как я могу установить интервал между заголовком и первым TextButton ?
Я попытался установить a .padding(top = X.dp) в столбце или в первой текстовой кнопке, но, похоже, это создает только пробел в нижней части AlertDialog .
Также установка обычая .height(X.dp) не сработала.

Я использую Compose 1.0.3

Ответ №1:

Как @Abhimanyu прекрасно объясняет, почему это не работает прямо сейчас, вот обходной путь, который я использую для достижения желаемого заполнения: добавление заголовка в содержимое. AlertDialog title параметр ‘s необязателен, поэтому его можно опустить/установить в null значение , а вместо этого в параметр можно вставить фактический заголовок text (который содержит содержимое диалогового окна).

 @Composable
fun MyComposable() {
    AlertDialog(
        title = null,
        text = {
            Column {
                Text(
                    modifier = Modifier.padding(vertical = 16.dp),
                    text = "Actual title"
                )

                // Rest of the dialog content
            }
        }
    )
}
 

Ответ №2:

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

На данный момент (6 октября 2021 года) это требование кажется невыполнимым с текущей версией compose (1.0.3).
Обновим это, как только это станет возможным.

AlertDialog Код не учитывает указанные значения заполнения.

AlertDialog.kt

 // Baseline distance from the first line of the text to the last line of the title
private val TextBaselineDistanceFromTitle = 36.sp
 

Смещение текста, используемое для позиционирования, рассчитывается следующим образом.

 val textOffset = if (titlePlaceable == null) {
    TextBaselineDistanceFromTop.roundToPx()
} else {
    TextBaselineDistanceFromTitle.roundToPx()
}
 

Расстояние между первым текстом в составляемом тексте и последним текстом в составляемом заголовке всегда 36.sp равно .

Код диалогового окна предупреждения в compose в настоящее время кажется слишком хакерским, и я мог видеть несколько задач в коде.

Надеюсь, код скоро будет изменен для обработки большего количества сценариев.

Ответ №3:

Я использую этот составляемый как первый ребенок внутри Column

 @Composable
fun HackySpacer(space: Dp) {
    Box(
        modifier = Modifier
            .height(space)
            .fillMaxWidth()
    ) {
        Text(text = "")
    }
} 
 

Это не идеально, но это работает для моего использования.

Ответ №4:

Теперь это возможно с помощью нового AlertDialog из Compose Material 3. Интервал по умолчанию между title и text гораздо более разумный, и его также можно добавить Modifier.padding() или Spacer() к обоим.

 implementation("androidx.compose.material3:material3:1.0.0-alpha01")
 
 androidx.compose.material3.AlertDialog(
    onDismissRequest = {
        openDialog.value = false
    },
    title = {
        Text(text = "Title", modifier = Modifier.padding(50.dp))
    },
    text = {
        Spacer(Modifier.height(50.dp))
        Text(text = "Turned on by default")
    },
    confirmButton = {
        TextButton(
            onClick = {
                openDialog.value = false
            }
        ) {
            Text("Confirm")
        }
    },
    dismissButton = {
        TextButton(
            onClick = {
                openDialog.value = false
            }
        ) {
            Text("Dismiss")
        }
    }
)