JetpackCompose从入门到实战学习笔记11——在compose中使用DropdownMenu

1,899 阅读1分钟

JetpackCompose从入门到实战学习笔记11——在compose中使用DropdownMenu

1.简介:

DropdownMenu:

下拉列表菜单,菜单具有一个切换按钮,它是生成菜单的元素。例如一个图标,点击该图标可以触发菜单。 DropdownMenu的内容可以是DropdownMenuItems,也可以是自定义内容。

@Composable
fun DropdownMenu(
    expanded: Boolean?,
    onDismissRequest: (() -> Unit)?,
    modifier: Modifier? = Modifier,
    offset: DpOffset? = DpOffset(0.dp, 0.dp),
    properties: PopupProperties? = PopupProperties(focusable = true),
    content: (@Composable @ExtensionFunctionType ColumnScope.() -> Unit)?
): Unit
​

2.各个属性参数的含义:

参数描述类型
expanded是否展开boolean
onDismissRequest在菜单关闭时调用Unit
offset设置偏移量float
properties可以设置 focusable、dismissOnBackPress、dismissOnClickOutside、securePolicyboolean

3.简单使用:

package com.example.dropdowncomposedemo
​
import android.os.Bundle
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.example.dropdowncomposedemo.ui.theme.DropDownComposeDemoTheme
​
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            DropDownComposeDemoTheme {
                LazyColumn(modifier = Modifier.fillMaxSize(),
                verticalArrangement = Arrangement.spacedBy(16.dp),
                contentPadding = PaddingValues(16.dp)//添加内容间距
                ){
                    items(
                        listOf(
                            "Philipp",
                            "Martin",
                            "Carl",
                            "John",
                            "Jake",
                            "Melanie",
                            "Tony",
                            "Tom",
                            "JoJo",
                            "Mary",
                            "Jack",
                            "Henry",
                            "James",
                            "MiMi",
                            "Hank",
                        )
                    ){ name ->
                        PersonItem(personName = name.toString(), dropDownItems = listOf(
                            DropDownItem("点赞"),
                            DropDownItem("评论"),
                            DropDownItem("收藏"),
                        ), onItemClick = {
                            Toast.makeText(applicationContext,it.text,Toast.LENGTH_LONG).show()
                        })
                    }
                }
            }
        }
    }
}

4.PersonItem类:

/**
 *@author: njb
 *@date:  2023/3/30 23:02
 *@desc:
 */
data class DropDownItem(
    val text: String
)
​
@Composable
fun PersonItem(
    personName: String,
    dropDownItems: List<DropDownItem>,
    modifier: Modifier = Modifier,
    onItemClick: (DropDownItem) -> Unit
) {
    var isContextMenuVisible by rememberSaveable {
        mutableStateOf(false)
    }
    var pressOffset by remember {
        mutableStateOf(0.dp)
    }
    var itemHeight by remember {
        mutableStateOf(0.dp)
    }
    val density = LocalDensity.current
    val interactionSource = remember {
        MutableInteractionSource()
    }
​
    Card(
        elevation = 4.dp,
        modifier = modifier
            .onSizeChanged {
                itemHeight = with(density) { it.height.toDp() }
            }
    ) {
        Box(modifier = Modifier
            .fillMaxWidth()
            .indication(interactionSource, LocalIndication.current)
            .pointerInput(true) {
                detectTapGestures(
                    onLongPress = {
                        isContextMenuVisible = true
                    },
                    onPress = {
                        isContextMenuVisible = true
                        val press = PressInteraction.Press(it)
                        interactionSource.emit(press)
                        tryAwaitRelease()
                        interactionSource.emit(PressInteraction.Release(press))
                    }
                )
            }
            .padding(16.dp)
        ) {
            Text(text = personName)
        }
        DropdownMenu(
            expanded = isContextMenuVisible,
            offset = DpOffset(x= 10.dp,y = 10.dp),
                    onDismissRequest = { isContextMenuVisible = false }) {
            dropDownItems.forEach { item ->
                run {
                    DropdownMenuItem(
                        onClick = {
                            onItemClick(item)
                            isContextMenuVisible = false
                        }
                    )
                    {
                        Text(text = item.text)
                    }
                }
            }
        }
    }
}

5.实现效果如下:

新建视频录制10.gif

image.png

6.源码地址:

gitee.com/jackning_ad…