Android PopupMenu动态绑定菜单项文本溢出无法换行问题咨询
解决方案
默认PopupMenu的菜单项使用系统内置布局,其中的TextView默认强制单行显示,所以你添加的换行符不会生效,我们可以通过自定义布局+ListPopupWindow的方式实现需求,以下是两种可行方案:
方案1:实现菜单项多行显示
步骤1:创建自定义菜单项布局
新建res/layout/item_popup_multiline.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tv_menu_item" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingVertical="12dp" android:paddingHorizontal="16dp" android:textSize="16sp" android:textColor="@android:color/black" android:singleLine="false" android:maxLines="5" android:lineSpacingExtra="2dp"/>
步骤2:替换原有PopupMenu逻辑为ListPopupWindow
将你原有的PopupMenu相关代码替换为以下实现:
// 先获取服务器返回的数据集 val dataList = it.value.data if (dataList.isNullOrEmpty()) { Toast.makeText(applicationContext, "No data found", Toast.LENGTH_SHORT).show() return@observe // 对应你的回调逻辑 } // 初始化ListPopupWindow val listPopupWindow = ListPopupWindow(this@AddReportActivity) // 绑定锚点控件,和原来的PopupMenu保持一致 listPopupWindow.anchorView = search_diagnosis // 宽度可设置为和锚点控件一致,也可以固定为指定尺寸 listPopupWindow.width = ViewGroup.LayoutParams.WRAP_CONTENT // 构建列表数据和适配器 val itemTexts = dataList.map { it.name } val adapter = object : ArrayAdapter<String>(this@AddReportActivity, R.layout.item_popup_multiline, itemTexts) { override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { val view = super.getView(position, convertView, parent) val textView = view.findViewById<TextView>(R.id.tv_menu_item) textView.text = itemTexts[position] return view } } listPopupWindow.setAdapter(adapter) // 设置菜单项点击事件,和原有逻辑保持一致 listPopupWindow.setOnItemClickListener { _, _, position, _ -> listPopupWindow.dismiss() val selectedText = itemTexts[position] slectedDiagnosis = selectedText search_diagnosis.setQuery(selectedText, false) } // 显示弹窗 listPopupWindow.show()
方案2:实现菜单项横向滚动
如果不需要换行,想要横向滚动查看完整内容,只需要修改自定义布局即可,新建res/layout/item_popup_scroll.xml:
<?xml version="1.0" encoding="utf-8"?> <HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="none"> <TextView android:id="@+id/tv_menu_item" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingVertical="12dp" android:paddingHorizontal="16dp" android:textSize="16sp" android:textColor="@android:color/black" android:singleLine="true" android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever" android:focusable="true" android:focusableInTouchMode="true"/> </HorizontalScrollView>
之后把适配器的布局替换为上述布局即可实现横向滚动效果。
内容的提问来源于stack exchange,提问作者Mallikarjun Hampannavar
相关产品推荐
相关产品推荐

