【问题标题】:How to show enlarged initial letter upon alphabet column tap如何在字母列点击时显示放大的首字母
【发布时间】:2022-06-10 21:56:48
【问题描述】:

当我点击屏幕右侧的字母时,是否可以在屏幕中间显示一个大字母?每次我用手指执行此操作时,我都看不到我的手指在敲什么字母?

enum class Items(@StringRes val nameId: Int, val typeId: Int) {
    Item1(R.string.apple, R.string.fruit),
    Item2(R.string.banana, R.string.fruit),
    Item3(R.string.cherry, R.string.fruit),
    Item4(R.string.date, R.string.fruit),
    Item5(R.string.eggplant, R.string.vegetable),
    Item6(R.string.fig, R.string.fruit),
    Item7(R.string.guava, R.string.fruit),
    Item8(R.string.jackfruit, R.string.fruit),
    Item9(R.string.kiwi, R.string.fruit),
    Item10(R.string.leek, R.string.vegetable),
    Item11(R.string.okra, R.string.vegetable),
    Item12(R.string.pumpkin, R.string.fruit),
    Item13(R.string.rhubarb, R.string.fruit),
    Item14(R.string.spinach, R.string.vegetable),
    Item15(R.string.turnip, R.string.vegetable),
    Item16(R.string.watermelon, R.string.fruit);
}

val items = remember { arrayOf(
        Items.Item1,
        Items.Item2,
        Items.Item3,
        Items.Item4,
        Items.Item5,
        Items.Item6,
        Items.Item7,
        Items.Item8,
        Items.Item9,
        Items.Item10,
        Items.Item11,
        Items.Item12,
        Items.Item13,
        Items.Item14,
        Items.Item15,
        Items.Item16).sortedBy { getString(it.nameId) } }
val headers = remember { items.map { getString(it.nameId).first().uppercase() }.toSet().toList() }
Row {
    val listState = rememberLazyListState()
    LazyColumn(
        state = listState,
        modifier = Modifier.weight(1f)
    ) {
        items(items) {
            Column() {
                Text(
                    text = stringResource(id = it.nameId)
                )
                Text(
                    text = stringResource(id = it.typeId)
                )
            }
        }
    }
    val offsets = remember { mutableStateMapOf<Int, Float>() }
    var selectedHeaderIndex by remember { mutableStateOf(0) }
    val scope = rememberCoroutineScope()

    fun updateSelectedIndexIfNeeded(offset: Float) {
        val index = offsets
            .mapValues { abs(it.value - offset) }
            .entries
            .minByOrNull { it.value }
            ?.key ?: return
        if (selectedHeaderIndex == index) return
        selectedHeaderIndex = index
        val selectedItemIndex = items.indexOfFirst { getString(it.nameId).first().uppercase() == headers[selectedHeaderIndex] }
        scope.launch {
            listState.scrollToItem(selectedItemIndex)
        }
    }

    Column(
        verticalArrangement = Arrangement.SpaceEvenly,
        modifier = Modifier
            .fillMaxHeight()
            .background(Color.Green)
            .pointerInput(Unit) {
                detectTapGestures {
                    updateSelectedIndexIfNeeded(it.y)
                }
            }
            .pointerInput(Unit) {
                detectVerticalDragGestures { change, _ ->
                    updateSelectedIndexIfNeeded(change.position.y)
                }
            }
    ) {
        headers.forEachIndexed { i, header ->
            Text(
                header,
                modifier = Modifier.onGloballyPositioned {
                    offsets[i] = it.boundsInParent().center.y
                }
            )
        }
    }
}

【问题讨论】:

    标签: android kotlin android-jetpack-compose kotlin-coroutines


    【解决方案1】:

    如果您可以添加 onclicklistener,我建议您每次按下某个项目时显示一个 toast。 例如:

    item1.setOnClickListener {
        Toast.makeText(getActivity(), "A", Toast.LENGTH_SHORT).show()
    }
    

    【讨论】:

    • 这样做的一个缺点是,在最新版本的 android 中,Toast 会在其中包含您的应用程序图标,因此与屏幕信息相关的功能看起来有点奇怪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    相关资源
    最近更新 更多