ListPopupWindow 不遵守 WRAP_CONTENT 宽度规范

2024-01-03

我正在尝试使用 ListPopupWindow 通过ArrayAdapter(最终这将是一个更复杂的自定义适配器)。代码如下。如截图所示,得到的结果ListPopupWindow看起来就像内容宽度为零一样。它显示了正确的项目数量,这些项目仍然是可点击的,并且点击成功会产生一个Toast,所以至少这么多工作正常。

一个有趣的注释:我可以提供以像素为单位的宽度popup.setWidth(...)代替ListPopupWindow.WRAP_CONTENT而且它会显示一些内容,但这看起来很不灵活。

我该如何制作ListPopupWindow包装其内容?

测试活动:

public class MainActivity extends Activity {

    private static final String[] STRINGS = {"Option1","Option2","Option3","Option4"};
    private View anchorView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getActionBar().setHomeButtonEnabled(true);
        setContentView(R.layout.activity_main);
        anchorView = findViewById(android.R.id.home);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                showPopup();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    private void showPopup() {
        ListPopupWindow popup = new ListPopupWindow(this);
        popup.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, STRINGS));
        popup.setAnchorView(anchorView);
        popup.setWidth(ListPopupWindow.WRAP_CONTENT);
        popup.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(MainActivity.this, "Clicked item " + position, Toast.LENGTH_SHORT).show();
            }
        });
        popup.show();
    }
}

截屏:


您可以测量适配器内容的宽度:

private int measureContentWidth(ListAdapter listAdapter) {
    ViewGroup mMeasureParent = null;
    int maxWidth = 0;
    View itemView = null;
    int itemType = 0;

    final ListAdapter adapter = listAdapter;
    final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
    final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
    final int count = adapter.getCount();
    for (int i = 0; i < count; i++) {
        final int positionType = adapter.getItemViewType(i);
        if (positionType != itemType) {
            itemType = positionType;
            itemView = null;
        }

        if (mMeasureParent == null) {
            mMeasureParent = new FrameLayout(mContext);
        }

        itemView = adapter.getView(i, itemView, mMeasureParent);
        itemView.measure(widthMeasureSpec, heightMeasureSpec);

        final int itemWidth = itemView.getMeasuredWidth();

        if (itemWidth > maxWidth) {
            maxWidth = itemWidth;
        }
    }

    return maxWidth;
}

在你的 showPopup() 函数中:

 ArrayAdapter arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, STRINGS);
    popup.setAdapter(arrayAdapter);
    popup.setAnchorView(anchorView);
    popup.setContentWidth(measureContentWidth(arrayAdapter));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ListPopupWindow 不遵守 WRAP_CONTENT 宽度规范 的相关文章

随机推荐

  • 模板模板类中的非类型参数的类型在 C++14 中不可推导,但在 C++17 中可推导

    标题有点令人困惑 但我的意思是这个具体案例 template
  • 如何更新黑莓手机的屏幕?

    我正在开发一个应用程序 我遇到了与更新屏幕相关的问题 该问题已经在堆栈中 我尝试在单击按钮时使用 myappscreen invalidate 但它不会更新屏幕 请帮我解决这个问题 您的屏幕是活动屏幕吗 要重绘活动屏幕 您只需调用 inva
  • 如何使用特定版本的 CocoaPods

    是否可以以某种方式指定我在升级或安装 Podfile 时想要使用的 CocoaPods 版本 我曾多次遇到 Podfile 在某一版本的 CocoaPods 上可以正常工作 但在其他版本上却无法正常工作的情况 例如 我正在寻找的语法如下 p
  • MongoDB 对同一文档的并发更新不具有原子性

    目前 我们有一个 orderId 我们为用户提供福利 发布 有多个事件可以触发福利 发布 但条件是只能触发 1 个事件 因此 为了处理当前请求 我们创建了一个布尔字段POSTING EVENT SENT 最初设置为 false 后来任何能够
  • 自定义 ValidationAttribute 不起作用。始终返回 true

    我创建了一个自定义 ValidationAttribute 类来检查应用程序中人员的年龄 public class MinimumAgeAttribute ValidationAttribute public int MinAge get
  • Ansible:如何在set_fact模块中对整数变量进行算术运算?

    有谁知道如何在set fact模块中对整数变量进行算术赋值 目前 我设法通过使用 Jinja2 模板使用 String 变量来做到这一点 如下所示 set fact flagStr 0 name Add by one one one set
  • OnPropertyChange 在当前上下文中不存在?

    似乎看不出我哪里出错了 OnPropertyChange 没有被重新确认任何建议吗 public class MedicationList INotifyPropertyChanged public int MedicationID get
  • 从另一个 Java 程序运行 Hadoop 作业

    我正在编写一个程序 该程序接收映射器 缩减器的源代码 动态编译映射器 缩减器并从中生成 JAR 文件 然后它必须在 hadoop 集群上运行这个 JAR 文件 对于最后一部分 我通过代码动态设置所有必需的参数 然而 我现在面临的问题是 代码
  • 如何在flutter web中添加自定义字体?

    所以我现在正在开发 flutter 移动应用程序一段时间了 我想探索 flutter web 现在我尝试添加自定义字体 但它没有显示自定义字体 我已经添加了所有依赖项 并为字体创建了一个单独的文件夹 并将其添加到 pubspec yaml
  • Behat/Mink 无法模拟点击页脚中的按钮[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 尝试对页脚中的项目使用 然后我按 对
  • Heroku 陷入为 NodeJs 应用程序构建源代码的困境

    当我尝试在 heroku 上部署我的应用程序时 它陷入了远程 构建源 一开始以为是网络问题 换了网络 但是问题依旧 我也尝试过强制推送 也没用 Counting objects 100 19 19 done Delta compressio
  • Windows光标最大尺寸

    我有一个大小为 128x128 的光标 但是当我使用 LoadCursor 加载并显示它时 它只有 32x32 哪个API可以正确实现 MS 似乎调整了它的大小 谢谢 Windows XP 不包含任何大于 32x32 的系统光标 如果包含较
  • 更改 github 帐户 mac 命令行

    我有两个 github 帐户 一个用于工作 一个用于家庭 我正在处理一个个人项目 无法推送到 origin master 因为它说我仍然登录到我的工作帐户 我重置了我的全局用户 user name user email user token
  • React Admin - 如何使用 abc/def 等嵌套路径调用 dataProvider

    React admin 的Resource组件图name端点的 prop 值 例如 访问数据 http example com abc your Resource组件看起来像这样
  • Jasper 报告 HTML 组件

    我设计了一个简单的报告 将 HTML 调色板放入其中 iFrame 当我运行报告时 我收到此异常 java lang ClassNotFoundException net sf jasperreports components html H
  • 将 apache-spark 日志记录发送到 Amazon EMR 集群上的 redis/logstash 的最佳方法 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 Amazon EMR 集群上触发提交作业 我希望将所有 Spark 日志记录发送到 redis logstash 在 EMR 下配置
  • Pandas 将用户代理列解析为多列

    我有一个 http 请求日志的数据框 唯一相关的列是我正在尝试解析的 userAgent 列 我正在使用 ua parser 这会将每个 userAgent 变成一个嵌套字典 如下所示 gt gt gt from ua parser imp
  • 如何在 MIPS 汇编中找到没有除法或模运算符的余数

    我想找到一种方法来知道一个整数是除以3还是7而不使用除法 因为它在MIPS汇编中非常慢 我做了很多研究但一无所获 有一种方法描述为格兰隆德和蒙哥马利 https gmplib org tege divcnst pldi94 pdf需要 奇
  • 如何将依赖子查询转换为联接以获得更好的性能?

    我有一个存储 主题 的数据库 每个主题都与一大堆图像相关联 这些主题的屏幕截图 现在我想显示最新的 10 个主题 对于每个主题 我只想从数据库中获取一张图像 ID 最低的图像 目前我的查询如下所示 我正在使用子查询 SELECT DISTI
  • ListPopupWindow 不遵守 WRAP_CONTENT 宽度规范

    我正在尝试使用 ListPopupWindow 通过ArrayAdapter 最终这将是一个更复杂的自定义适配器 代码如下 如截图所示 得到的结果ListPopupWindow看起来就像内容宽度为零一样 它显示了正确的项目数量 这些项目仍然