Android PopupMenu和PopupWindow

本文详细介绍了Android开发中PopupWindow和PopupMenu的使用方法。PopupWindow可根据需求自定义弹出位置,而PopupMenu则用于创建简单的弹出式菜单。两者均可通过代码实现丰富的交互效果。

前言

  在Android开发中,时不时地可能弹出个窗口或者对话框,常用的Android对话框有两种:Dialog和PopupWindow。Dialog是一种非阻塞的对话框,它一般显示图表、标题、文本和按钮;PopupWindow是一种阻塞的对话框,只由外部线程或者PopupWindow本身执行退出操作。

阻塞型对话框:当对话框出现的时候,当前线程暂停。

  PopupWindow有点类似于Dialog,相同点在于都是弹出窗口,并且都可以对其进行自定义,同时可以监听窗口里的组件。但它与Dialog又有很大的区别,PopupWindow只是弹出窗口,不会使得宿主Activity组件失去焦点,也就是说PopupWindow弹出后,我们仍然可以与宿主Activity进行交互,Dialog却不能做到这一点。PopupWindow弹出的位置可以有很多,按照有无偏移,可以分为无偏移和偏移两种;按照参数类型不同,又可以分为相对某个控件的位置和父容器内部的相对位置两种。

使用

  • 这里写图片描述

      在Layout中的布局:

<Button
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:onClick="onOpenPopupWindow"
      android:text="打开PopupWindow" />

  在Activity中的代码:(说明,activity_main4中放置的是一个自定义的View)

public void onOpenPopupWindow(View view) {
    LayoutInflater mLayoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    assert mLayoutInflater != null;
    view = mLayoutInflater.inflate(R.layout.activity_main4, null);
    popupWindow = new PopupWindow(view,
        LinearLayout.LayoutParams.MATCH_PARENT,
        LinearLayout.LayoutParams.MATCH_PARENT);
    popupWindow.setOutsideTouchable(true);
    popupWindow.setAnimationStyle(R.style.PopupAnimation);
    popupWindow.update();
    popupWindow.setTouchable(true);
    popupWindow.setFocusable(false);
    popupWindow.showAtLocation(view, Gravity.CENTER, 0, 0);
}

PopupMenu

  这是一个弹出式的Menu,比PopupWindow简单。

使用

  • 设置PopupMenu创建弹出式菜单
  • 这里写图片描述

      在Layout中的布局:

<Button
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:onClick="createPopupMenu"
      android:text="打开PopupMenu" />
/**
 * 设置PopupMenu创建弹出式菜单
 */
public void createPopupMenu(View view) {
  // 实例化PopupMenu对象
  PopupMenu popupMenu = new PopupMenu(this, view);
  // 将R.menu.main加载到popupMenu中
  getMenuInflater().inflate(R.menu.menu1, popupMenu.getMenu());
  // 为popupMenu菜单的菜单项单机时间绑定时间监听器
  popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
      @Override
      public boolean onMenuItemClick(MenuItem item) {
          switch (item.getItemId()) {
              case R.id.add:
                  Toast.makeText(MainActivity.this, "Add", Toast.LENGTH_SHORT).show();
                  break;
              case R.id.modify:
                  Toast.makeText(MainActivity.this, "Modify", Toast.LENGTH_SHORT).show();
                  break;
              case R.id.delete:
                  Toast.makeText(MainActivity.this, "Delete", Toast.LENGTH_SHORT).show();
                  break;
              case R.id.select:
                  Toast.makeText(MainActivity.this, "Select", Toast.LENGTH_SHORT).show();
                  break;
              default:
                  break;
          }
          return true;
      }
  });
  popupMenu.show();
}

  menu1.xml的具体内容:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.czk.testview.MainActivity">

    <item
        android:id="@+id/action_settings"
        android:icon="@android:drawable/ic_menu_add"
        android:orderInCategory="100"
        android:title="@string/action_settings" >
        <menu>
            <item
                android:icon="@android:drawable/ic_menu_add"
                android:id="@+id/add"
                android:orderInCategory="100"
                android:showAsAction="always"
                android:title="Add" />
            <item
                android:icon="@android:drawable/ic_menu_add"
                android:orderInCategory="100"
                android:id="@+id/delete"
                android:showAsAction="always"
                android:title="Delete" />
            <item
                android:icon="@android:drawable/ic_menu_add"
                android:id="@+id/modify"
                android:orderInCategory="100"
                android:showAsAction="always"
                android:title="Modify" />
            <item
                android:icon="@android:drawable/ic_menu_add"
                android:orderInCategory="100"
                android:showAsAction="always"
                android:id="@+id/select"
                android:title="Select" />
        </menu>
    </item>

    <item
        android:id="@+id/Add"
        android:icon="@drawable/ic_launcher"
        android:orderInCategory="100"
        android:showAsAction="collapseActionView"
        android:title="About" />


</menu>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值