这个答案演示了如何在带注释的字符串中嵌入链接并使其可单击。这非常有效,并且可以使用正确的 URL 触发点击。但是,我似乎无法编写一个单击带注释的文本来打开链接的测试。有人成功编写过这样的测试吗?我的生产代码与答案中的非常相似。下面是我的测试代码:
@Test
fun it_should_open_terms_of_service_link() {
val termsOfServiceText = getString(R.string.settings_terms)
try {
Intents.init()
stubAnyIntent()
composeTestRule.onNode(hasText(termsOfServiceText, substring = true)).performClick()
assertLinkWasOpened(getString(R.string.settings_terms_link))
} finally {
Intents.release()
}
}
Run Code Online (Sandbox Code Playgroud)
它看起来像是hasText(termsOfServiceText, substring = true)获取整个带注释的字符串节点,而不是仅获取子字符串“服务条款”。因此,单击方法确实被触发,只是不在带注释的字符串中的正确位置触发。如果需要,很乐意提供更多信息。谢谢!
如果将文本字段聚焦在屏幕底部附近,键盘会出现一会儿,然后立即隐藏。但是,如果您从上方聚焦某些 TextField,键盘将照常打开,您可以滚动到底部。如果 windowSoftInputMode 设置为 adjustmentResize,则会发生这种情况。如果未设置,则行为将变为随机(键盘可能会重叠内容,也可能会推动工具栏等)。也许我只是做错了这一切,我不知道。我想知道以前是否有人遇到过这个问题并可以帮助我。
示例代码(为了简单起见,我在这里保留可变状态,不使用 ViewModel):
@Composable
fun Greeting() {
Scaffold(topBar = {
TopAppBar(title = { Text(text = "Some title") })
}) {
val focusManager = LocalFocusManager.current
LazyColumn(
contentPadding = PaddingValues(all = 16.dp),
verticalArrangement = Arrangement.spacedBy(space = 16.dp)
) {
items(count = 20) { index ->
val (value, onValueChange) = rememberSaveable { mutableStateOf("Some value $index") }
TextField(
value = value,
onValueChange = onValueChange,
modifier = Modifier.fillMaxWidth(),
label = { Text(text = "Some label $index") },
keyboardOptions = KeyboardOptions(imeAction = …Run Code Online (Sandbox Code Playgroud) android-jetpack-compose android-jetpack-compose-text android-jetpack-compose-list
我有这样的用户界面:
val scrollState = rememberScrollState()
Column(
modifier = Modifier
.fillMaxSize(1F)
.padding(horizontal = 16.dp)
.verticalScroll(scrollState)
) {
TextField(...)
// multiple textfields
TextField(
//...
modifier = Modifier.focusOrder(countryFocus).onFocusChanged {
if(it == FocusState.Active) {
// scroll to this textfield
}
},
)
}
Run Code Online (Sandbox Code Playgroud)
我在此列中有多个 TextFields,当其中一个聚焦时,我想将 Column 滚动到它。scrollState 中有一个方法,scrollState.smoothScrollTo(0f)但我不知道如何获得聚焦的 TextField 位置。
更新:
看来我找到了一个可行的解决方案。我用过onGloballyPositioned并且有效。但我不确定这是否是解决此问题的最佳方法。
var scrollToPosition = 0.0F
TextField(
modifier = Modifier
.focusOrder(countryFocus)
.onGloballyPositioned { coordinates ->
scrollToPosition = scrollState.value + coordinates.positionInRoot().y
}
.onFocusChanged {
if (it == FocusState.Active) {
scope.launch { …Run Code Online (Sandbox Code Playgroud) 在视图世界中,我们可以使用@tools:sample/*资源来获取示例文本,例如full_names、first_names、cities等dates。
据我所知,Android Studio 布局编辑器使用了这些注释,以便能够在编辑器上查看模拟数据。
在 Compose 世界中没有 xml,因此也没有@tools:sample/*.
Android Studio 有什么办法仍然可以在函数中使用这些示例测试吗@Composable?或者还有其他内置的 Compose 解决方案吗?
android android-jetpack-compose android-jetpack-compose-text
android kotlin android-jetpack-compose android-compose-textfield android-jetpack-compose-text
我正在尝试创建一个可重用的 NumberField 组件:
@Composable
fun NumberField(
value: Number?,
onNumberChange: (Number) -> Unit,
) {
TextField(
value = value?.toString() ?: "",
onValueChange = {
it.toDoubleOrNull()?.let { value ->
if (value % 1.0 == 0.0) {
onNumberChange(value.toInt())
} else {
onNumberChange(value)
}
}
},
singleLine = true,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number)
)
}
Run Code Online (Sandbox Code Playgroud)
用作:
@Composable
fun NumberContent() {
val number = remember { mutableStateOf<Number?>(null) }
NumberField(value = number.value) {
number.value = it
}
}
Run Code Online (Sandbox Code Playgroud)
我希望数字是 Int 或 Double,具体取决于用户输入的内容。在您尝试输入十进制数之前,我上面的内容一直有效,因为它似乎是“5。”,不会解析为双精度数。我想让用户输入5.然后填写rest。因此,我不想在小数点后自动添加零,因为这可能不是他们想要输入的下一个数字。这是最好的方法吗?我知道我可以接受任何文本,然后尝试将他们稍后输入的文本格式化为 int 或 double …
android number-formatting kotlin android-jetpack-compose android-jetpack-compose-text
我想AnnotatedString在 Jetpack Compose 中绘制一些背景(此处为示例)。使用视图系统,我们可以通过编写自定义文本视图来做到这一点 - https://medium.com/androiddevelopers/drawing-a-rounded-corner-background-on-text-5a610a95af5。有没有办法使用 Jetpack Compose 来做到这一点?
我正在查看修饰符draw,Text但我似乎无法弄清楚如何获取行号或需要在其上绘制背景的文本的开头/结尾。
我应该使用Canvas而不是Text?
android android-jetpack-compose android-jetpack-compose-text
我知道如何将 Jetpack Compose 中的文本与基线对齐。
但现在我需要对齐两个不同大小的文本,这些文本Row通过这两种字体中较大的字体的上升来对齐。如果有意义的话,我想将此视为“按顶部基线”对齐两个文本。 Modifier.align(Alignment.Top)不起作用,因为它不会通过上升对齐,而是通过布局的顶部对齐,然后文本在顶部无法正确对齐。
我试图看看如何做到这一点,但显然没有现成的函数或修饰符?我什至没有找到在 Compose 中访问 Text 的 ascent 属性等的方法。所以不确定这怎么可能?
感谢您的任何提示!:)
编辑:这就是使用时的样子Alignment.Top。但我希望这两个文本在顶部对齐。
android android-jetpack-compose android-jetpack-compose-text
我想动态更改我的应用程序语言,而不需要重新启动以Activity使结果生效。我现在要做的是添加一个可变Boolean状态,它是 switch 并由所有Text元素使用。
要更改语言,我在可单击回调中调用以下代码(我使用该框作为虚拟对象,只是为了测试):
val configuration = LocalConfiguration.current
val resources = LocalContext.current.resources
Box(
modifier = Modifier
.fillMaxWidth()
.height(0.2.dw)
.background(Color.Red)
.clickable {
// to change the language
val locale = Locale("bg")
configuration.setLocale(locale)
resources.updateConfiguration(configuration, resources.displayMetrics)
viewModel.updateLanguage()
}
) {
}
Run Code Online (Sandbox Code Playgroud)
updateLanguage()然后它使用该方法切换语言值
@HiltViewModel
class CityWeatherViewModel @Inject constructor(
private val getCityWeather: GetCityWeather
) : ViewModel() {
private val _languageSwitch = mutableStateOf(true)
var languageSwitch: State<Boolean> = _languageSwitch
fun updateLanguage() {
_languageSwitch.value = !_languageSwitch.value
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,为了更新每个Text可组合项,我需要将 …
android kotlin android-jetpack-compose android-jetpack-compose-text
我想用数字显示文本,我想要实现的是在显示文本时为该文本设置动画。动画是应该将计数器从零增加到目标值。我尝试使用animateIntAsState但它不起作用。
这就是我累的状态:
val daysCounter by animateIntAsState(
targetValue = days ,
animationSpec = tween(
durationMillis = 5000,
easing = FastOutSlowInEasing
)
)
Run Code Online (Sandbox Code Playgroud)
和文字:
Text(
text = "$daysCounter",
fontSize = 40.sp,
color = MaterialTheme.colors.onPrimary,
fontWeight = FontWeight.Bold
)
Run Code Online (Sandbox Code Playgroud) android android-jetpack-compose android-jetpack-compose-text jetpack-compose-animation