PopupWindow的使用

一、什么是PopupWindow

PopupWindow在app中经常能看到,官网上面的定义是这样:

PopupWindow是一个能用来显示任意视图且浮动在当前Activity之上的容器。

功能和Dialog是不是很类似?

二、PopupWindow的基本使用

先上效果图:
PopupWindow效果图

代码里面注释很详细,这里就不说明了

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener, RadioGroup.OnCheckedChangeListener {
    private Button mButton01;
    private Button mButton02;
    private Button mButton03;
    private Button mButton04;
    private PopupWindow mPopupWindow;
    private int mScreenWidth;
    private int mPopupWindowWidth;
    private int mPopupWindowHeight;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mButton01 = (Button) findViewById(R.id.button01);
        mButton02 = (Button) findViewById(R.id.button02);
        mButton03 = (Button) findViewById(R.id.button03);
        mButton04 = (Button) findViewById(R.id.button04);

        mButton01.setOnClickListener(this);
        mButton02.setOnClickListener(this);
        mButton03.setOnClickListener(this);
        mButton04.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            // 相对某个控件的位置(正左下方),无偏移
            case R.id.button01:
                getPopupWindowInstance();
                mPopupWindow.showAsDropDown(view);
                break;
            // 相对某个控件的位置(正左下方),有偏移
            case R.id.button02:
                getPopupWindowInstance();
                mPopupWindow.showAsDropDown(view, 50, 50);// X、Y方向各偏移50
                break;
            // 相对于父控件的位置,无偏移
            case R.id.button03:
                getPopupWindowInstance();
                mPopupWindow.showAtLocation(view, Gravity.CENTER, 0, 0);
                break;
            // 相对于父控件的位置,有偏移
            case R.id.button04:
                getPopupWindowInstance();
                mPopupWindow.showAtLocation(view, Gravity.BOTTOM, 0, 50);
                break;

        }
    }

    /**
     * 获取popupWindow实例
     */
    private void getPopupWindowInstance() {
        if (null != mPopupWindow) {
            mPopupWindow.dismiss();
            return;
        } else {
            initPopuptWindow();
        }
    }

    /**
     * 创建popupwindow
     */
    private void initPopuptWindow() {
        View popupWindow = LayoutInflater.from(this).inflate(R.layout.popup_window, null);
        RadioGroup radioGroup = (RadioGroup) popupWindow.findViewById(R.id.radioGroup);
        radioGroup.setOnCheckedChangeListener(this);

        // 创建一个PopupWindow
        // 参数1:contentView 指定PopupWindow的内容
        // 参数2:width 指定PopupWindow的width
        // 参数3:height 指定PopupWindow的height
        mPopupWindow = new PopupWindow(popupWindow, LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);
        //popupwindow之外点击消失
        mPopupWindow.setOutsideTouchable(true);
        //设置背景才有效果
        mPopupWindow.setBackgroundDrawable(new BitmapDrawable());
        // 获取屏幕和PopupWindow的width和height
        mScreenWidth = getWindowManager().getDefaultDisplay().getWidth();
        mScreenWidth = getWindowManager().getDefaultDisplay().getHeight();
        mPopupWindowWidth = mPopupWindow.getWidth();
        mPopupWindowHeight = mPopupWindow.getHeight();
    }

    @Override
    public void onCheckedChanged(RadioGroup radioGroup, int i) {
        mPopupWindow.dismiss();
    }
}

activity_mian.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:id="@+id/activity_main"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.ymq.popupwindowdemo.MainActivity">

    <Button
        android:id="@+id/button01"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="以自己为Anchor,不偏移" />

    <Button
        android:id="@+id/button02"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="以自己为Anchor,有偏移" />

    <Button
        android:id="@+id/button03"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="以屏幕中心为参照,不偏移(正中间)" />

    <Button
        android:id="@+id/button04"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="以屏幕下方为参照,下方中间" />
</LinearLayout>

popup_window.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:background="@color/colorPrimaryDark"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="选择状态:"
        android:textColor="@android:color/white"
        android:textSize="20px" />

    <RadioGroup
        android:id="@+id/radioGroup"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical" >


        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="在线" />

        <RadioButton
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="离线" />

        <RadioButton
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="隐身" />
    </RadioGroup>
</LinearLayout>

方法showAsDropDown()方法的作用就是用来显示PopupWindow,在文档里面有详细的说明。

 //在锚点的左下角显示PopupWindow,无偏移
showAsDropDown(View anchor) 
//以锚点左下角为原点指定偏移量的位置显示PopupWindow
showAsDropDown(View anchor, int xoff, int yoff)
//已父容器为锚点显示
showAsDropDown(View anchor, int gravity,int xoff, int yoff)  

总结:

  1. 创建PopupWindow需要显示的视图,当然我们也可以在后面通过setContentView(View contentView)方法为popupwindow设置视图。
  2. 创建popupwindow对象,可以创建空内容的,后面自己设置视图,也可以将第一步创建好的视图传进去,还可以指定其宽高。对应的构造方法如下:

    PopupWindow()   //Create a new empty, non focusable popup window of dimension (0,0). 
    PopupWindow(Context context)    //Create a new empty, non focusable popup window of dimension (0,0). 
    PopupWindow(View contentView)   //Create a new non focusable popup window which can display the contentView. 
    PopupWindow(int width, int height)  Create a new empty, non focusable popup window. 
    PopupWindow(View contentView, int width, int height)    //Create a new non focusable popup window which can display the contentView. 
    
  3. 为popupwindow设置一些属性,比如

    setAnimationStyle(int animationStyle)
    setBackgroundDrawable(Drawable background)
    setElevation(float elevation)
    setOnDismissListener(PopupWindow.OnDismissListener onDismissListener)
    setWindowLayoutMode(int widthSpec, int heightSpec)
    setSoftInputMode(int mode)
    setOutsideTouchable(boolean touchable)
    
  4. 显示PopupWindow.showAsDropDown(View anchor)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值