android - ListPopupWindow 不遵守 WRAP_CONTENT 宽度规范

标签 android user-interface popupwindow

我正在尝试使用 ListPopupWindow 通过 ArrayAdapter 显示字符串列表(最终这将是一个更复杂的自定义适配器)。代码如下。如屏幕截图所示,生成的 ListPopupWindow 似乎内容宽度为零。它显示了正确数量的项目,这些项目仍然是可点击的,并且点击成功会产生一个 Toast,所以至少有那么多工作正常。

一个有趣的说明:我可以为 popup.setWidth(...) 而不是 ListPopupWindow.WRAP_CONTENT 提供一个以像素为单位的宽度,它会显示一些内容,但这似乎很不灵活。

如何让 ListPopupWindow 包装其内容?

测试 Activity :

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();
    }
}

截图:

enter image description here

最佳答案

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

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));

关于android - ListPopupWindow 不遵守 WRAP_CONTENT 宽度规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14200724/

相关文章:

user-interface - 如何删除 dat.GUI 元素?

javafx - usrpagestage.initStyle(StageStyle.UTILITY) 没有完全显示内容

javascript - 使用此 javascript 在屏幕中央打开新窗口?

java - 如何从数据库中的数据填充 UI?

android - 如何在 compose 中控制 AnimatedVisibility 的方向?

android - 谷歌地图标记拖动事件在 android 中不起作用

android - 在应用程序重新启动之前,Flurry 不会向服务器发送事件

c++ - 对 GUI 库的建议?

c++ - 为什么旧的小部件没有被删除?

java - 如何使用触摸监听器停用布局的 alpha "color"