popmenu 和popWindow

资料来源

https://blog.csdn.net/a379992210/article/details/48423923

https://blog.csdn.net/shanxuyang/article/details/47068487

popMenu

popMenu实现在某个view的上方或者下方显示一个折叠的系统风格的折叠菜单,向上还是向下弹出由系统控制(下方有空间从下方弹出,下方没有空间从上方弹出)


//初始化按钮
mPopMenuBtn = (Button) findViewById(R.id.button3);


//为按钮注册点击事件
public void popMenuBtnOnClick(View view) {
//新建一个popMenu实例
        mPopMenu = new PopupMenu(this, mPopMenuBtn);
//为这个实例的menu加载布局资源
        mPopMenu.getMenuInflater().inflate(R.menu.menu_popup_window, mPopMenu.getMenu());
        mPopMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                //do something
                return true;
            }
        });
        mPopMenu.show();
    }

popWindow

与popMenu类似

但是默认实现是点击控件后,在控件下方显示一个窗口,这个窗口可以指定大小以及显示位置,但是不能像popMenu一样自动调整从上方还是下方弹出

另外,popWindow与AlertDialog的区别

最关键的区别是AlertDialog不能指定显示位置,只能默认显示在屏幕最中间(当然也可以通过设置WindowManager参数来改变位置)。而PopupWindow是可以指定显示位置的,随便哪个位置都可以,更加灵活。(引用https://blog.csdn.net/harvic880925/article/details/49272285)

下面简单实现一个popWindow() 实现mPopWindowBtn的下拉菜单效果

//初始化按钮
mPopWindowBtn = (Button) findViewById(R.id.button4);

public void popWindowBtnOnClick(View view) {
//通过布局文件获取一个View
        mPopWindowView = getLayoutInflater().inflate(R.layout.dialog_layout, null);
//新建一个window,为这个window填充视图,指定宽度高度,指定是否可以点击
// Focusable 为True,PopupWindow的点击事件才会相应
        mPopWindow = new PopupWindow(mPopWindowView, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT, true);
//为窗口中的控件注册点击事件
	TextView choosePhoto = (TextView) mPopWindowView.findViewById(R.id.choosePhoto);
        TextView takePhoto = (TextView) mPopWindowView.findViewById(R.id.takePhoto);
        choosePhoto.setOnClickListener(this);
        takePhoto.setOnClickListener(this);
//控制窗口弹出位置
//showAsDropDown,作为下拉菜单.showAtLocation(),选择弹出位置.
        mPopWindow.showAsDropDown(mPopWindowBtn);
    }

@Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.takePhoto:
                Toast.makeText(this,"点击了拍照",Toast.LENGTH_SHORT).show();
                Log.i(TAG, "onClick: v.getId="+view.getId());
                break;
            case R.id.choosePhoto:
                Toast.makeText(this,"点击了从相册选择",Toast.LENGTH_SHORT).show();
                Log.i(TAG, "onClick: v.getId="+view.getId());
                break;
        }

       //关闭窗口
            mPopWindow.dismiss();
        
    }

如果想要控制window弹出的位置

可以通过showAtLocation()来控制

注意窗口中的点击事件需要自己注册,没有类似于popMenu自己的监听器

默认popWindow点击back和外部控件,会先关闭窗口,需要再次点击back和外部控件才能触发相应的点击事件

如果需要popWindow既能响应back和外部控件点击关闭窗口,又能同时触发外部控件的点击事件

可以这样设置

popupWindow.setFocusable(false);
popupWindow.setOutsideTouchable(true);

猜你喜欢

转载自blog.csdn.net/rungby/article/details/80436860