一直以來都覺得 Android 中的 PopupWindow 不好用。主要有以下兩點:
1、寬度不好控制
2、位置不好控制
今天單說第1點。
由於應用有好幾種國家的語言,加上各設備宣染效果不完全一樣,對popupWindow寬度肯定不能寫固定值,一般用系統提供的WRAP_CONTENT,但顯示的效果往往不是預期的。
怎樣才能正確顯示呢,我們可以根據內容來計算寬度(找所有內容中最長的一個),代碼如下:
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; } //調用 ArrayAdapter<String> adapter = new ArrayAdapter<>(mContext, android.R.layout.simple_list_item_1, STRINGS); popupWindow.setFocusable(true); popupWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT); popupWindow.setWidth(measureContentWidth(adapter));
效果:
這樣就可以了。