我有LazyColumn一个Text(). 我已经设置了 clickable forText()但它相当于OnClickListner. 现在我想设置一个等价的setOnLongClickListener. 我怎样才能做到这一点?
@Composable
fun MyText(name: String, modifier: Modifier = Modifier) {
var isSelected by remember {
mutableStateOf(false)
}
Text(
text = "Hello $name!",
modifier = modifier
.clickable { isSelected = !isSelected }
.padding(16.dp)
)
Run Code Online (Sandbox Code Playgroud) 我有一个lazyColumn,我想在列中使用它,但出现以下错误并且应用程序崩溃:
不允许在相同方向的布局中嵌套可滚动的布局,例如 LazyColumn 和 Column(Modifier.verticalScroll())。如果您想在项目列表之前添加标题,请查看 LazyColumn 组件,该组件具有 DSL api,允许首先通过 item() 函数添加标题,然后通过 items() 添加项目列表
lazyColumn 代码,我在此代码中有一个列表:
@Composable
fun UpScreenSection(
modifier: Modifier,
state: ProfileState,
viewModel: ProfileViewModel
) {
Spacer(modifier = Modifier.size(24.dp))
Column(
modifier = modifier
.fillMaxSize()
.padding(24.dp)
) {
if (!state.items.isNullOrEmpty()) {
Box(
modifier = modifier
.fillMaxSize()
) {
LazyColumn(modifier = modifier.fillMaxSize()) {
items(state.items) { item ->
ProfileListItems(item = item, onItemClick = {
//TODO Navigate to specific screen
when (it.id) {
1 -> {
}
2 -> {
}
3 -> { …Run Code Online (Sandbox Code Playgroud) 可使用代码重现:
var value by remember { mutableStateOf("Hello\nWorld\nInvisible") }
TextField(
value = value,
onValueChange = { value = it },
label = { Text("Enter text") },
modifier = Modifier
.onFocusChanged { Log.d("TAG", "1 OnFocusChangedCalled: $it") }
)
TextField(
value = value,
onValueChange = { value = it },
label = { Text("Enter text") },
modifier = Modifier
.onFocusChanged { Log.d("TAG", "2 OnFocusChangedCalled: $it") }
)
Run Code Online (Sandbox Code Playgroud)
只需打开视图,Logcat 就会显示:
D/TAG: 1 OnFocusChangedCalled: Inactive
D/TAG: 2 OnFocusChangedCalled: Inactive
Run Code Online (Sandbox Code Playgroud)
对于传统的 XML 布局,onFocusChangedListener 仅在用户实际与字段交互时触发。
使用撰写布局,仅当用户从文本字段中删除焦点时,我才尝试进行错误验证。
然而,这种行为导致我的验证在视图初始化后立即触发。 …
android kotlin android-jetpack-compose android-compose-textfield android-jetpack-compose-text
我有一个文本字段,其中不能超过 10 个字符,并且要求用户以“mm/dd/yyyy”格式输入日期。每当用户键入前 2 个字符时,我都会附加“/”,当用户键入接下来的 2 个字符时,我会再次附加“/”。
为了实现这一目标,我做了以下操作:
var maxCharDate = 10
TextField(
value = query2,
onValueChange = {
if (it.text.length <= maxCharDate) {
if (it.text.length == 2 || it.text.length == 5)
query2 = TextFieldValue(it.text + "/", selection = TextRange(it.text.length+1))
else
query2 = it
}
emailErrorVisible.value = false
},
label = {
Text(
"Date of Birth (mm/dd/yyyy)",
color = colorResource(id = R.color.bright_green),
fontFamily = FontFamily(Font(R.font.poppins_regular)),
fontSize = with(LocalDensity.current) { dimensionResource(id = R.dimen._12ssp).toSp() })
},
.
.
.
Run Code Online (Sandbox Code Playgroud)
它正在工作,只是附加的“/”在按退格键时不会被删除,而其他字符会被删除。
如何使按退格键时“/”也被删除?
android textfield android-jetpack-compose android-compose-textfield
今天我发现 MaterialTheme 对文本颜色应用了 alpha 值。正如您从所附示例中看到的,当我更改背景颜色时,文本的颜色似乎有所不同,因为它具有透明度值。我可以强制设置颜色 ( Text(color = MaterialTheme.colors.onBackground, ....)) 并且这可以正常工作,但我不想对每个文本都执行此操作。
MaterialTheme 为什么要这样做?我该如何覆盖这种行为?
Compose 和 Material Compose Material 版本:1.2.1
@Preview
@Composable
private fun Preview_Playground() {
MaterialTheme {
Box(Modifier.background(Color.Green)) {
Text("Test", fontWeight = FontWeight.ExtraBold, modifier = Modifier.alpha(1f))
}
}
}
Run Code Online (Sandbox Code Playgroud)
android android-jetpack-compose android-compose-textfield android-jetpack-compose-material3
我试图让这个下拉菜单变得动态。当我在文本字段中输入内容时,我希望列表能够更新(根据用户输入的内容进行过滤),并且用户可以从过滤后的下拉列表中进行选择。
我发现材质 3 下拉菜单在展开状态下会阻止用户输入。如果用户开始输入并且我们说
onValueChange = {
selectedOptionText = it
expanded = true
}
Run Code Online (Sandbox Code Playgroud)
用户被阻止进一步输入,因为展开的 ExposedDropdownMenu 会阻止用户输入
如何使文本字段动态打开下拉菜单,并根据用户输入更新列表?并且列表项是可选的
为了添加更多上下文,我知道如果我们说properties = PopupProperties(focusable = false),DropdownMenu不会阻止用户输入
DropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false },
properties = PopupProperties(focusable = false)
)
Run Code Online (Sandbox Code Playgroud)
但 UI 行为并不相同。我正在寻找 DropdownMenuBox 行为 DropdownMenu 属性 = PopupProperties(focusable = false)
android-jetpack-compose android-compose-textfield android-jetpack-compose-material3 android-compose-exposeddropdown
我发现一篇文章描述了如何在LazyColumn中实现视差视图,有这样一个方法:
@Composable
fun ImageParallaxScroll() {
val lazyListState = rememberLazyListState()
val list = (0..1_000).map{ "Item $it" }.toList()
val firstItemTranslationY: LazyListState by remember {
derivedStateOf {
when {
lazyListState.layoutInfo.visibleItemsInfo.isNotEmpty() && lazyListState.firstVisibleItemIndex == 0 -> lazyListState.firstVisibleItemScrollOffset * .6f
else -> 0f
}
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
问题是整个remember下划线块都带有红线,并且出现这样的错误:
Type 'TypeVariable(T)' has no method 'getValue(Nothing?, KProperty<*>)' and thus it cannot serve as a delegate
Run Code Online (Sandbox Code Playgroud)
不明白这里有什么问题?
android android-jetpack android-jetpack-compose android-compose-textfield
我用来TextField获取用户输入并使用 stateflow 来处理视图模型中的文本状态/值。
问题是每次TextField的值发生变化时,HomeContent()函数都会被重新组合。
布局检查器输出图像
我的问题是,仅仅HomeContent()因为值发生变化就可以重构整个函数TextField,还是有办法避免函数重构?
视图模型
class MyViewModel() : ViewModel() {
private val _nameFlow = MutableStateFlow("")
val nameFlow = _nameFlow.asStateFlow()
fun updateName(name: String) {
_nameFlow.value = name
}
}
Run Code Online (Sandbox Code Playgroud)
主要活动
class MainActivity : ComponentActivity() {
private val myViewModel by viewModels<MyViewModel>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
AppArchitectureTheme {
HelloScreen(myViewModel)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
主屏幕
@Composable
fun HelloScreen(viewModel: MyViewModel) {
val name = viewModel.nameFlow.collectAsState()
HelloContent(
provideName = { …Run Code Online (Sandbox Code Playgroud) 如何使用 Jetpack Compose 在 Android 中正确换行?我从网络上了解了该功能,我在网络上用于­此类情况。
我定义了带有可能换行符的字符串值,如下所示:Korrespondenz\u00ADsprache。不幸的是,这不适用于 Android。
我使用下面的代码
Text(
text = "Korrespondenz\u00ADsprache",
style = MaterialTheme.typography.h4
)
Run Code Online (Sandbox Code Playgroud)
目前结果如下所示:
预期结果应如下所示:
android hyphenation android-jetpack-compose android-compose-textfield