Включить взаимодействие с пользователем

Jetpack Compose обеспечивает детальную интерактивность в Text . Выбор текста теперь стал более гибким и может выполняться в компонуемых макетах. Взаимодействие с пользователем в тексте отличается от других составных макетов, поскольку вы не можете добавить модификатор к части составного Text . На этой странице представлены API, обеспечивающие взаимодействие с пользователем.

Выбрать текст

По умолчанию составные элементы недоступны для выбора, а это означает, что пользователи не могут выбирать и копировать текст из вашего приложения. Чтобы включить выделение текста, оберните текстовые элементы составным SelectionContainer :

@Composable
fun SelectableText() {
    SelectionContainer {
        Text("This text is selectable")
    }
}

Короткий отрывок текста, выбранный пользователем.

Возможно, вы захотите отключить выделение определенных частей выбираемой области. Для этого вам нужно обернуть невыбираемую часть составным DisableSelection :

@Composable
fun PartiallySelectableText() {
    SelectionContainer {
        Column {
            Text("This text is selectable")
            Text("This one too")
            Text("This one as well")
            DisableSelection {
                Text("But not this one")
                Text("Neither this one")
            }
            Text("But again, you can select this one")
            Text("And this one too")
        }
    }
}

Более длинный отрывок текста. Пользователь попытался выделить весь отрывок, но поскольку к двум строкам был применен DisableSelection, они не были выбраны.

Получить позицию щелчка по тексту

Чтобы прослушивать клики по Text , вы можете добавить модификатор clickable . Однако, если вы хотите получить позицию щелчка внутри составного Text , в случае, когда у вас есть разные действия, основанные на разных частях текста, вам нужно вместо этого использовать ClickableText :

@Composable
fun SimpleClickableText() {
    ClickableText(text = AnnotatedString("Click Me"), onClick = { offset ->
        Log.d("ClickableText", "$offset -th character is clicked.")
    })
}

Нажмите с аннотацией

Когда пользователь нажимает на составной элемент Text , вы можете захотеть прикрепить дополнительную информацию к части значения Text , например, URL-адрес, прикрепленный к определенному слову, которое нужно открыть в браузере. Для этого вам необходимо прикрепить аннотацию, которая принимает в качестве параметров тег ( String ), элемент ( String ) и текстовый диапазон. Из AnnotatedString эти аннотации можно фильтровать по их тегам или текстовым диапазонам. Вот пример:

@Composable
fun AnnotatedClickableText() {
    val annotatedText = buildAnnotatedString {
        append("Click ")

        // We attach this *URL* annotation to the following content
        // until `pop()` is called
        pushStringAnnotation(
            tag = "URL", annotation = "https://developer.android.com"
        )
        withStyle(
            style = SpanStyle(
                color = Color.Blue, fontWeight = FontWeight.Bold
            )
        ) {
            append("here")
        }

        pop()
    }

    ClickableText(text = annotatedText, onClick = { offset ->
        // We check if there is an *URL* annotation attached to the text
        // at the clicked position
        annotatedText.getStringAnnotations(
            tag = "URL", start = offset, end = offset
        ).firstOrNull()?.let { annotation ->
            // If yes, we log its value
            Log.d("Clicked URL", annotation.item)
        }
    })
}

{% дословно %} {% дословно %} {% дословно %} {% дословно %}