You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何制作图标下方的小型弹出框(如示例所示)?

实现图标下方的小型弹出框

你可以通过以下两种常用方案实现图标下方的小型弹出框,替代默认居中且尺寸过大的AlertDialog:

方案一:使用PopupWindow(原生Android)

PopupWindow可以完全自定义布局和显示位置,适合灵活调整样式:

  1. 自定义弹出框布局(创建res/layout/popup_menu.xml):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:background="@drawable/popup_bg"
    android:padding="8dp">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="编辑"
        android:paddingHorizontal="16dp"
        android:paddingVertical="8dp"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="删除"
        android:paddingHorizontal="16dp"
        android:paddingVertical="8dp"/>

</LinearLayout>
  1. 代码中初始化并显示:
// 获取触发弹窗的图标View
val iconView = findViewById<ImageView>(R.id.icon)

// 加载自定义布局
val popupView = LayoutInflater.from(this).inflate(R.layout.popup_menu, null)
// 创建PopupWindow,设置宽高为包裹内容
val popupWindow = PopupWindow(
    popupView,
    ViewGroup.LayoutParams.WRAP_CONTENT,
    ViewGroup.LayoutParams.WRAP_CONTENT,
    true // 可点击外部关闭
)

// 设置背景(可选,解决点击外部不消失的问题)
popupWindow.setBackgroundDrawable(ContextCompat.getDrawable(this, R.drawable.popup_bg))

// 绑定点击事件,显示在图标下方
iconView.setOnClickListener {
    val location = IntArray(2)
    iconView.getLocationOnScreen(location)
    popupWindow.showAtLocation(
        iconView,
        Gravity.NO_GRAVITY,
        location[0],
        location[1] + iconView.height + 10 // 10dp是图标和弹窗的间距
    )
}

方案二:使用Material Design DropdownMenu(更简洁)

如果项目引入了Material组件,DropdownMenu可以自动锚定到目标View,无需手动计算位置:

  1. XML布局:
<com.google.android.material.button.MaterialButton
    android:id="@+id/icon_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:icon="@drawable/ic_more"
    style="@style/Widget.MaterialComponents.Button.Icon"/>

<com.google.android.material.dropdown.DropdownMenu
    android:id="@+id/dropdown_menu"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:anchor="@id/icon_btn"
    app:dropdownVerticalOffset="10dp">

    <com.google.android.material.dropdown.DropdownMenuItem
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="编辑"/>

    <com.google.android.material.dropdown.DropdownMenuItem
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="删除"/>

</com.google.android.material.dropdown.DropdownMenu>
  1. 代码触发显示:
val dropdownMenu = findViewById<DropdownMenu>(R.id.dropdown_menu)
findViewById<MaterialButton>(R.id.icon_btn).setOnClickListener {
    dropdownMenu.show()
}

注意事项

  • 两种方案都用wrap_content控制弹窗尺寸,避免过大
  • PopupWindow记得设置setBackgroundDrawable,否则点击外部可能无法关闭
  • DropdownMenu会自动处理弹窗的位置和消失逻辑,适配不同屏幕

内容的提问来源于stack exchange,提问作者Bilbo Baggins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 11:40:30