Android PopupWindow 疑難雜症之寬度WRAP_CONTENT


一直以來都覺得 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));

效果:

這樣就可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM