PopupWindow弹窗和Menu菜单

缪志新
2023-12-01

1.系统菜单:

//使用系统菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu,menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    switch (item.getItemId()){
        case R.id.blue:
            Toast.makeText(this, "蓝色", Toast.LENGTH_SHORT).show();
            break;
        case R.id.green:
            Toast.makeText(this, "绿色", Toast.LENGTH_SHORT).show();
            break;
        case R.id.red:
            Toast.makeText(this, "红色", Toast.LENGTH_SHORT).show();
            break;
    }
    return super.onOptionsItemSelected(item);
}

在实现菜单时我们需要先重写一个onCreateOptionsMenu,在此方法里面找到自己写的布局文件,然后重写对应的onOptionsItemSelected,这个方法提供了一个MenuItem对象,我们在需要点击菜单里面选项做出相应的方法时,可以做一个switch选择器,括号里面的条件就可以咱们MenuItem对象调用getitemid(),通过选择不同的id在里面做出不同的方法。

2.上下文菜单:

//上下文菜单
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
    switch (item.getItemId()){
        case R.id.green:
            button.setTextColor(Color.parseColor("#00ff00"));
            break;
        case R.id.blue:
            button.setTextColor(Color.parseColor("blue"));
            break;
        case R.id.red:
            button.setTextColor(Color.parseColor("red"));
            break;
    }
    return super.onContextItemSelected(item);
}

public void custom(View view) {
    Custompopwinodw custompopwinodw = new Custompopwinodw(this);
    custompopwinodw.showAsDropDown(button);
}

这个方法同上面的上下文菜单非常相似,但是要将它绑定到相应的空间上就要在onCreate方法里实现注册(

registerForContextMenu();

)这个方法在上下文菜单中一定不能忘。

3.PopupMenu菜单:

//popmenu菜单
private void popmenu() {
    PopupMenu popupMenu = new PopupMenu(this,button);
    popupMenu.inflate(R.menu.menu);
    popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            switch (item.getItemId()){
                case R.id.green:
                    button.setTextColor(Color.parseColor("#00ff00"));
                    break;
                case R.id.blue:
                    button.setTextColor(Color.parseColor("blue"));
                    break;
                case R.id.red:
                    button.setTextColor(Color.parseColor("red"));
                    break;
            }
            return false;
        }
    });
    popupMenu.show();
}

要注意的是在实例化的时候()里面的两个参数,第一个是上下文,第二个是要显示的控件,然后用inflate方法获取自己写menu布局,写一个popumenu的点击事件和上面的方法一样。

4.popuwindow

//popuwindow
private void popwindow() {
    final PopupWindow popupWindow = new PopupWindow(this);
    final View view = LayoutInflater.from(this).inflate(R.layout.item,null);
    view.findViewById(R.id.iv).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            popupWindow.dismiss();
        }
    });
    final TextView textView = view.findViewById(R.id.tv);
    textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            textView.setText("我改变了");
        }
    });
    final WindowManager.LayoutParams layoutParams= getWindow().getAttributes();
    layoutParams.alpha=0.5f;
    getWindow().setAttributes(layoutParams);
    popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
        @Override
        public void onDismiss() {
            WindowManager.LayoutParams layoutParams1 = getWindow().getAttributes();
            layoutParams1.alpha=1;
            getWindow().setAttributes(layoutParams1);
        }
    });
    popupWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
    popupWindow.setHeight(ViewGroup.LayoutParams.MATCH_PARENT);
    popupWindow.setContentView(view);
    popupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.shape));
    popupWindow.showAsDropDown(button,0,0);
}

这个方法自己顶一个View对象获取布局,可以用这个对象获取到布局里面的控件,在获取完后写点击事件写相应的方法,这个方法可以设置当弹窗打开时背景透明需要WindowManager.LayoutParams layoutParams= getWindow().getAttributes();获取对象,再用对应的layoutParams.alpha写透明值,注意是float类型得数据。

 类似资料: