2-5-10 PopupWindow

标注:本文为个人学习使用,仅做自己学习参考使用,请勿转载和转发
2018-06-27: 初稿。参考博主coder-pig

0. 引言

  • PopupWindow:悬浮框
  • 官方文档:PopupWindow
  • 一个弹出窗口控件,可以用来显示任意View,而且会浮动在当前的activity的顶部。
  • Alertdialog是非线程阻塞的,PopupWindow是阻塞线程的
  • 具体是什么样子的,打开QQ,然后选择其中的一个对话Item,长按,会出现置顶/删除选项。

1. PopupWindow相关方法

1.1 构造方法
  1. public PopupWindow (Context context)
  2. public PopupWindow(View contentView, int width, int height)
  3. public PopupWindow(View contentView)
  4. public PopupWindow(View contentView, int width, int height, boolean focusable)
    contentView是PopupWindow显示的View,focusable是否显示焦点
1.2 常用的一些方法
  1. setContentView(View contentView):设置PopupWindow显示的View
  2. getContentView():获得PopupWindow显示的View
  3. showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移
  4. showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移
  5. showAtLocation(View parent, int gravity, int x, int y): 相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移 PS:parent这个参数只要是activity中的view就可以了!
  6. setWidth/setHeight:设置宽高,也可以在构造方法那里指定好宽高, 除了可以写具体的值,还可以用WRAP_CONTENT或MATCH_PARENT, popupWindow的width和height属性直接和第一层View相对应。
  7. setFocusable(true):设置焦点,PopupWindow弹出后,所有的触屏和物理按键都由PopupWindows 处理。其他任何事件的响应都必须发生在PopupWindow消失之后,(home 等系统层面的事件除外)。 比如这样一个PopupWindow出现的时候,按back键首先是让PopupWindow消失,第二次按才是退出 activity,准确的说是想退出activity你得首先让PopupWindow消失,因为不并是任何情况下按back PopupWindow都会消失,必须在PopupWindow设置了背景的情况下 。
  8. setAnimationStyle(int):设置动画效果

2.使用代码示例

运行效果图

2-5-10 PopupWindow_第1张图片

实现关键代码
先贴下动画文件:anim_pop.xml



    
    
 

接着是popupWindow的布局:item_popip.xml:




    

MainActivity.java:

public class MainActivity extends AppCompatActivity {

    private Button btn_show;
    private Context mContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = MainActivity.this;
        btn_show = (Button) findViewById(R.id.btn_show);
        btn_show.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                initPopWindow(v);
            }
        });
    }


    private void initPopWindow(View v) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.item_popup, null, false);
        Button btn_xixi = (Button) view.findViewById(R.id.btn_xixi);
        Button btn_hehe = (Button) view.findViewById(R.id.btn_hehe);
        //1.构造一个PopupWindow,参数依次是加载的View,宽高
        final PopupWindow popWindow = new PopupWindow(view,
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);

        popWindow.setAnimationStyle(R.anim.anim_pop);  //设置加载动画

        //这些为了点击非PopupWindow区域,PopupWindow会消失的,如果没有下面的
        //代码的话,你会发现,当你把PopupWindow显示出来了,无论你按多少次后退键
        //PopupWindow并不会关闭,而且退不出程序,加上下述代码可以解决这个问题
        popWindow.setTouchable(true);
        popWindow.setTouchInterceptor(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return false;
                // 这里如果返回true的话,touch事件将被拦截
                // 拦截后 PopupWindow的onTouchEvent不被调用,这样点击外部区域无法dismiss
            }
        });
        popWindow.setBackgroundDrawable(new ColorDrawable(0x00000000));    //要为popWindow设置一个背景才有效


        //设置popupWindow显示的位置,参数依次是参照View,x轴的偏移量,y轴的偏移量
        popWindow.showAsDropDown(v, 50, 0);

        //设置popupWindow里的按钮的事件
        btn_xixi.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "你点击了嘻嘻~", Toast.LENGTH_SHORT).show();
            }
        });
        btn_hehe.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "你点击了呵呵~", Toast.LENGTH_SHORT).show();
                popWindow.dismiss();
            }
        });
    }
}

注意,在PopupWindow中实例化组件的时候,不能直接findViewById,需要在最开始实例化的Item组件中的View中findViewById,否则报错,代码示例

View view = LayoutInflater.from(mContext).inflate(R.layout.item_popup, null, false);
// PopupWindow中实例化组件的时候
Button btXixi = view.findViewById(R.id.bt_xixi);
Button btHere = view.findViewById(R.id.bt_here);
// 这样设置监听就没毛病
btXixi.setOnClickListener(MainActivity.this);
btHere.setOnClickListener(MainActivity.this);

3.示例代码下载

PopWindowDemo.zip

可看下述的参考文献:
Android PopupWindow的使用和分析
Android PopupWindow详解

你可能感兴趣的:(2-5-10 PopupWindow)