Я делаю приложение «визитная карточка», которое в основном отображает мою фотографию с моей контактной информацией внизу. Контактная информация состоит из строк, в каждой строке слева отображается значок приложения (например, Instagram), а справа — моя информация (например, имя пользователя My Instagram).
Я сделал отдельные компонуемые функции для каждого приложения и вызвал их, и все работает нормально.
Например:-
@Composable
fun InstagramContactInfo() {
Row(modifier = Modifier
.fillMaxWidth()
.padding(start = 30.dp, end = 30.dp, bottom = 16.dp),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically) {
Image(
painter = painterResource(R.drawable.icons8_instagram_48),
contentDescription = "Instagram Icon",
modifier = Modifier.size(50.dp)
)
Text(
text = "@username",
fontFamily = FontFamily.Monospace,
color = Color.White,
)
}
}
Но я хочу создать функцию, которая просто принимает изображение в качестве значка, дескриптор пользователя в виде строки, а затем отображает то же самое.
Как передать изображение в качестве параметра?
PS: я пытался встроить идентификатор ресурса, но он не работает
@Composable
fun ContactInfo(icon: String, handle: String) {
Row(modifier = Modifier
.fillMaxWidth()
.padding(start = 30.dp, end = 30.dp, bottom = 16.dp),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically) {
Image(
painter = painterResource(R.drawable.${icon}),
contentDescription = "App Icon",
modifier = Modifier.size(50.dp)
)
Text(
text = handle,
fontFamily = FontFamily.Monospace,
color = Color.White,
)
}
}
Вы должны получать возможность рисования из строки, как показано ниже. Но это не безопасно для времени компиляции. Если конкретное изображение недоступно в папке с возможностью рисования, оно может выдать Exception
Если у вас есть чертеж с идентификатором R.drawable.your_icon, вы должны пройти как «your_icon»
@Composable
fun ContactInfo(icon: String, handle: String) {
Row(modifier = Modifier
.fillMaxWidth()
.padding(start = 30.dp, end = 30.dp, bottom = 16.dp),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically) {
Image(
painter = painterResource(
LocalContext.current.resources.getIdentifier(icon, "drawable", LocalContext.current.packageName)),
contentDescription = "App Icon",
modifier = Modifier.size(50.dp)
)
Text(
text = handle,
fontFamily = FontFamily.Monospace,
color = Color.White,
)
}
}
Но если возможно использовать идентификатор ресурса напрямую, вы можете использовать его, как показано ниже, вместо строки.
@Composable
fun ContactInfo(@DrawableRes icon: Int, handle: String) {
Row(modifier = Modifier
.fillMaxWidth()
.padding(start = 30.dp, end = 30.dp, bottom = 16.dp),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically) {
Image(
painter = painterResource(icon),
contentDescription = "App Icon",
modifier = Modifier.size(50.dp)
)
Text(
text = handle,
fontFamily = FontFamily.Monospace,
color = Color.White,
)
}
}
Здесь можно поставить лайк R.drawable.your_icon .
Да, второй пример лучше, чем первый. Потому что в первом случае используется отражение ресурсов. И это может вызвать исключение, если идентификатор отсутствует.
Итак, второй пример лучше? Также большое спасибо!