В Android Studio, как передать изображение в качестве параметра функции с помощью Jetpack Compose?

Я делаю приложение «визитная карточка», которое в основном отображает мою фотографию с моей контактной информацией внизу. Контактная информация состоит из строк, в каждой строке слева отображается значок приложения (например, 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,
        )
    }
}
0
0
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны получать возможность рисования из строки, как показано ниже. Но это не безопасно для времени компиляции. Если конкретное изображение недоступно в папке с возможностью рисования, оно может выдать 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 .

Итак, второй пример лучше? Также большое спасибо!

Worker1432 31.12.2022 07:25

Да, второй пример лучше, чем первый. Потому что в первом случае используется отражение ресурсов. И это может вызвать исключение, если идентификатор отсутствует.

Gowtham K K 31.12.2022 07:31

Другие вопросы по теме