自定义PopupWindow全解

干货开始:

第一步:

private PopupWindow windowpx,
定义全局PupupWindow。


第二步:

xml version="1.0" encoding="utf-8"?>
xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:orientation="vertical">
            android:layout_width="match_parent"
        android:layout_height="2px"
        android:background="@color/background" />
            android:id="@+id/poppaixu_jiangxu"
        android:layout_width="match_parent"
        android:layout_height="80px"
        android:gravity="center"
        android:text="价格从高到低"
        android:textColor="#333333"
        android:textSize="28px">

            android:layout_width="match_parent"
        android:layout_height="2px"
        android:background="@color/background" />

            android:id="@+id/poppaixu_shengxu"
        android:layout_width="match_parent"
        android:layout_height="80px"
        android:gravity="center"
        android:text="价格从低到高"
        android:textColor="#333333"
        android:textSize="28px">

            android:layout_width="match_parent"
        android:layout_height="2px"
        android:background="@color/background" />

            android:id="@+id/poppaixu_xiaoliang"
        android:layout_width="match_parent"
        android:layout_height="80px"
        android:gravity="center"
        android:text="销量排行"
        android:textColor="#333333"
        android:textSize="28px">
            android:layout_width="match_parent"
        android:layout_height="2px"
        android:background="@color/background" />

自定义xml。


注意:因为我用的AutoUtils用来做屏幕适配,所以自己定义的时候使用dp为单位。

第三步:

//控件下方弹出窗口
private void showPXPopupWindow(View view1) {
    //自定义布局,显示内容
    View view = LayoutInflater.from(GoodsListActivity.this).inflate(R.layout.popop_paixu, null);
    final TextView jiangxu = (TextView) view.findViewById(R.id.poppaixu_jiangxu);
    jiangxu.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            clearView();
            paixuTv.setTextColor(Color.parseColor("#e50b0b"));
            paixuImg.setImageResource(R.drawable.shengxu);
            paixuTv.setText(jiangxu.getText().toString().trim());
            windowpx.dismiss();
            orderBy = 1;
            initData(page);
        }
    });
    final TextView shengxu = (TextView) view.findViewById(R.id.poppaixu_shengxu);
    shengxu.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            clearView();
            paixuTv.setTextColor(Color.parseColor("#e50b0b"));
            paixuImg.setImageResource(R.drawable.jiangxu);
            paixuTv.setText(shengxu.getText().toString().trim());
            windowpx.dismiss();
            orderBy = 2;
            initData(page);
        }
    });
    final TextView xiaoliang = (TextView) view.findViewById(R.id.poppaixu_xiaoliang);
    xiaoliang.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            clearView();
            paixuTv.setTextColor(Color.parseColor("#e50b0b"));
            paixuImg.setImageResource(R.drawable.shengxu);
            paixuTv.setText(xiaoliang.getText().toString().trim());
            windowpx.dismiss();
            orderBy = 3;
            initData(page);
        }
    });
    AutoUtils.auto(view);
    windowpx = new PopupWindow(view, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT, true);

    windowpx.setTouchable(true);
    windowpx.setTouchInterceptor(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return false;
            //这里如果返回true的话,touch事件将被拦截
            //拦截后 PoppWindow的onTouchEvent不被调用,这样点击外部区域无法dismiss
        }
    });

    //(注意一下!!)如果不设置popupWindow的背景,无论是点击外部区域还是Back键都无法弹框
    windowpx.setBackgroundDrawable(getResources().getDrawable(R.drawable.white));

    windowpx.showAsDropDown(view1);

}

添加显示方法,

其中传入的参数View1为popup要显示在该控件的下方。

注意:

1、因为我用的AutoUtils用来做屏幕适配,你如果不需要

AutoUtils.auto(view);

第三步中的这段代码可以删除。

2、

//(注意一下!!)如果不设置popupWindow的背景,无论是点击外部区域还是Back键都无法弹框
    windowpx.setBackgroundDrawable(getResources().getDrawable(R.drawable.white));
这个地方,我放入的R.drawable.white我是直接放了一个白色的背景图片。你也可以让UI给你一张特别小的全透明空背景顶数。

3、onClick里面的方法自己写。

记着写windowpx.dismiss();

我里面的代码是写的当点击选中其中的排序后,上面显示区域的TextView显示成选择后的值。

4、我写的是列表固定的,有时间的话,我会整理里面放入Recyclerview用来选择的PopupWindow、其实原理都一样,只需要view.findViewById()。找出来你放到布局文件里面的Recyclerview、然后自己放适配器就行。



另外:AutoUtils终极适配方案链接

你可能感兴趣的:(Android)