【问题标题】:Jetpack compose popup menuJetpack 撰写弹出菜单
【发布时间】:2020-08-21 03:48:02
【问题描述】:

我正在尝试使用 Jetpack compose 重写我的项目 UI。知道在 android 中使用 jetpack compose 添加弹出菜单吗? like this one

我尝试使用 Stack() 布局来实现它,但结果达不到标准。

@Composable
fun LiveDataComponentList(productList: List<Product>) {
    AdapterList(data = productList) { product ->
        Stack() {
            Clickable(onClick = { PopupState.toggleOwner(product) }) {
                Card(...) {...}

            if (PopupState.owner == product) {
                Surface(color = Color.Gray,modifier = Modifier.gravity(Alignment.TopEnd) + Modifier.padding(12.dp)) {
                    Column() {
                        Text("menu 1")
                        Text("menu 2")
                        Text("menu 3")
                        Text("menu 4")
                        Text("menu 5")
                    }
                }
            }
        }
    }
}

而 PopupState 是

@Model
object PopupState
{
    var owner:Product?=null
    fun toggleOwner(item:Product)
    {
        if(owner==item)
            owner=null
        else
            owner=item
    }
}

结果是

screenshot

【问题讨论】:

    标签: android kotlin android-jetpack-compose


    【解决方案1】:

    使用1.0.0,您可以使用DropdownMenu
    比如:

    var expanded by remember { mutableStateOf(false) }
    
    DropdownMenu(
        expanded = expanded,
        onDismissRequest = { expanded = false }
    ) {
        DropdownMenuItem(onClick = { /* Handle refresh! */ }) {
            Text("Refresh")
        }
        DropdownMenuItem(onClick = { /* Handle settings! */ }) {
            Text("Settings")
        }
        Divider()
        DropdownMenuItem(onClick = { /* Handle send feedback! */ }) {
            Text("Send Feedback")
        }
    }
    

    【讨论】:

      【解决方案2】:

      由于删除了 DropDownPopup,我使用 DropDownMenu 实现了一个,而不是像这样:

      弹出菜单:

      @Composable
      fun PopupMenu(
          menuItems: List<String>,
          onClickCallbacks: List<() -> Unit>,
          showMenu: Boolean,
          onDismiss: () -> Unit,
          toggle: @Composable () -> Unit,
      ) {
          DropdownMenu(
              toggle = toggle,
              expanded = showMenu,
              onDismissRequest = { onDismiss() },
          ) {
              menuItems.forEachIndexed { index, item ->
                  DropdownMenuItem(onClick = {
                      onDismiss()
                      onClickCallbacks[index]
                  }) {
                      Text(text = item)
                  }
              }
          }
      }
      

      Toggle(长按触发PopupMenu的东西):

      @Preview
      @Composable
      fun Toggle() {
          var showMenu by remember { mutableStateOf(false) }
      
          PopupMenu(
              menuItems = listOf("Delete"),
              onClickCallbacks = listOf { println("Deleted") },
              showMenu = showMenu,
              onDismiss = { showMenu = false }) {
              Text(
                  modifier = Modifier.clickable(onClick = {}, onLongClick = {
                      showMenu = true
                  }),
                  text = "Long click here",
              )
          }
      }
      

      【讨论】:

      • 是否可以添加除 Text() 以外的任何内容?例如,添加 ImageView 时崩溃..
      • 如何将它附加到按钮上?
      【解决方案3】:

      经过一番研究,我找到了解决方案,关键组件是 DropdownPopup

      @Composable
      fun LiveDataComponentList(productList: List<Product>) {
          AdapterList(data = productList) { product ->
      
      
              Clickable(onClick = { PopupState.toggleOwner(product) }) {
                  Card(...) {...}
              }
              if (PopupState.owner == product) {
                  DropdownPopup(dropDownAlignment = DropDownAlignment.End)
                  {
      
                      Surface(
                          shape = RoundedCornerShape(4.dp),
                          elevation = 16.dp,
                          color = Color.White,
                          modifier = Modifier.gravity(Alignment.End)+ Modifier.padding(end = 10.dp)
                      )
                      {
                          Column(modifier = Modifier.padding(10.dp)) {
      
                              MenuItem(text ="Edit", onClick = {})
                              MenuItem(text = "Delete", onClick = {})
                              MenuItem(text = "Details", onClick = {})
      
      
                          }
                      }
                  }
              }
      
      
          }
      }
      
      @Composable
      fun MenuItem(text: String, onClick: () -> Unit) {
          Clickable(onClick = onClick, modifier = Modifier.padding(6.dp)) {
              Text(text = text, style = MaterialTheme.typography.subtitle1)
      
          }
      }
      

      此解决方案适用于撰写版本 dev10

      【讨论】:

      • DropDownPopup 已于 2020 年 8 月 5 日删除 androidx.compose.ui:ui-*:0.1.0-dev16 已删除 dropdownPopup。 (I00430)developer.android.com/jetpack/androidx/releases/…
      • 删除并替换为?
      • @Jonathan 可能被DropdownMenu取代
      • 我们如何设置与DropdownMenu的对齐方式?
      猜你喜欢
      • 1970-01-01
      • 2020-11-03
      • 2022-10-07
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多