`

PopupWindow与PopupMenu的用法

 
阅读更多

转于:http://blog.csdn.net/a379992210/article/details/48423923

------------------------------------------------------------------------------------------

 

PopupWindow与PopupMenu的用法

@(Blog)[马克飞象|Markdown|Android]

 

 

PopupWindowPopupMenu的功能都是为了弹出一个窗体,不过PopupMenu的功能比较单一,而PopupWindow更强。

PopupMenu

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.focus.androidnote.popupwindow.PopupWindowActivity">
    <item 
        android:id="@+id/action_refresh" 
        android:title="@string/action_refresh"
        android:orderInCategory="100" 
        app:showAsAction="never" />
    <item android:id="@+id/action_settings" 
        android:title="@string/action_settings"
        android:orderInCategory="100" 
        app:showAsAction="never" />
</menu>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
public class PopupWindowActivity extends BaseActivity {

    private Button mPopWindowBtn;
    private Button mPopMenuBtn;

    private View mPopWindowView;
    private PopupWindow mPopWindow;

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

        mPopWindowBtn = (Button) findViewById(R.id.pop_window_btn);
        mPopMenuBtn = (Button) findViewById(R.id.pop_menu_btn);

        mPopMenu = new PopupMenu(mContext, mPopMenuBtn);
        mPopMenu = new PopupMenu(mContext, mPopMenuBtn);
        mPopMenu.getMenuInflater().inflate(R.menu.menu_popup_window, mPopMenu.getMenu());
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_popup_window, menu);

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.action_settings) {
            Toast.makeText(mContext, "Settings", Toast.LENGTH_SHORT).show();
        } else if (id == R.id.action_refresh) {
            Toast.makeText(mContext, "Refresh", Toast.LENGTH_SHORT).show();
        }

        return true;
    }

    public void popMenuBtnOnClick(View view) {
        mPopMenu.show();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

上面的代码最主要的只有3行

mPopMenu = new PopupMenu(mContext, mPopMenuBtn);
mPopMenu.getMenuInflater().inflate(R.menu.menu_popup_window, mPopMenu.getMenu());
  • 1
  • 2

很简单,只需要两行代码就搞定了。 
期初我以为PopupMenu会和ActivityMenu共用Click事件的,但是实现onOptionsItemSelected方法后发现只有ActivityMenu会触发事件,mPopMenu依然要通过setOnMenuItemClickListener()才能实现点击事件的监听 
效果图

PopupWindow

PopupWindow相比menu功能要强的多,可以实现布局更加复杂的效果 
效果图

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="100dp"
    android:layout_height="120dp"
    android:background="@drawable/bg_pop_window">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="20dp"
        android:background="@android:color/transparent"
        android:text="@string/action_settings"
        android:textColor="@android:color/white"
        android:textAllCaps="false"/>
    <View
        android:layout_width="wrap_content"
        android:layout_height="2dp"
        android:background="@color/material_blue_grey_800"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:background="@android:color/transparent"
        android:text="@string/action_refresh"
        android:textColor="@android:color/white"
        android:textAllCaps="false"/>
</LinearLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
mPopWindowView = getLayoutInflater().inflate(R.layout.pop_window_layout, null);
// Focusable 为True,PopupWindow的点击事件才会相应
mPopWindow = new PopupWindow(mPopWindowView, 150, 120, true);
// 必须在代码中设置一下背景色,点击外面不会隐藏此弹窗
mPopWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
// Focusable 为False时,不执行则点击外面不会隐藏此弹窗
//mPopWindow.setOutsideTouchable(true); 

// 显示 默认显示View的正下方,可以使用重载方法设置偏移量来调整位置
mPopWindow.showAsDropDown(view);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

其实用法和Menu差不多,只是背景色必须要在代码里进行设置,否则点击外面窗体不会消失,不知道这是BUG,还是Google就是这么设计的,有点想不通。

android:textAllCaps=”false” 防止Refresh显示的时候展现为全部大写 
Focusable属性,发现如果设为false的window内的组件就无法收到onClick事件

 

分享到:
评论

相关推荐

    使用PopupWindow实现的Popup菜单,PopupMenu可以根据ListView item的位置变化

    下面我们将深入探讨如何使用`PopupWindow`以及它与`ListView`的结合应用。 首先,`PopupWindow`是Android提供的一个可以显示任意视图的类。通过设置其大小、背景、内容等属性,我们可以自定义弹出窗口的样式和行为...

    Android中常见的弹框:Spinner、Dialog、PopupMenu、PopupWindow

    本文将深入探讨Android中的四种常见弹框:Spinner、Dialog、PopupMenu和PopupWindow,以及它们的基本使用方法。 首先,Spinner是Android系统提供的一种下拉选择框,通常用于在有限的选项中进行选择。它可以直接嵌入...

    PopupWindow

    - PopupMenu是PopupWindow的一种特例,主要用于在菜单图标上弹出选项列表,使用时需调用`PopupMenu.show()`。 在实际开发中,PopupWindow的灵活性使得它在各种场景下都有广泛的应用,如下拉菜单、悬浮按钮的扩展...

    PopupMenu 的使用

    在本篇文章中,我们将深入探讨PopupMenu的使用方法、常见属性以及如何自定义以满足特定需求。 ### PopupMenu的基本用法 首先,我们需要在布局文件中添加一个触发PopupMenu显示的按钮。例如: ```xml android:id...

    Android PopupWindow实现右侧、左侧和底部弹出菜单

    调用`show()`方法显示PopupWindow,使用`dismiss()`方法关闭它。 7. **优化用户体验**: 为了提高用户体验,可以考虑在用户触摸屏幕其他地方时自动关闭PopupWindow。可以通过设置触摸监听器并在触摸事件中调用`...

    Android PopupWindow的使用详解

    本篇文章将深入探讨`PopupWindow`的使用方法和相关知识点。 首先,`PopupWindow`的核心特性在于它的灵活性和可定制性。通过`PopupWindow`,开发者可以自定义窗口的大小、内容、背景、动画等,以满足各种界面需求。...

    popupwindow大集合

    3. 显示与隐藏:使用`showAtLocation()`或`showAsDropDown()`方法将PopupWindow显示在特定位置,用`dismiss()`方法关闭PopupWindow。 二、PopupWindow的属性和方法 1. `isShowing()`: 检查PopupWindow是否正在显示...

    用PopupWindow自定义系统菜单

    `PopupMenu`提供了丰富的定制选项,可以方便地与各种UI元素配合使用,提升用户体验。本篇文章将深入探讨如何使用`PopupWindow`来自定义系统菜单。 首先,`PopupWindow`是Android中的一个窗口类,它可以在屏幕上的...

    popupmenu弹出位置

    在调用`showAsDropDown()`方法之前,可以先获取到PopupWindow的宽度和高度,然后根据这些信息计算出适合的坐标,最后使用`setGravity()`方法来设置PopupWindow的重力,使其顶部对齐于触发视图的底部。 4. **随鼠标...

    Android编程实现popupwindow定时消失的方法

    此外,相关的Android相关内容还包括《Android窗口相关操作技巧总结》、《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android基本组件用法总结》、《Android视图View技巧总结》、...

    Android开发实现popupWindow弹出窗口自定义布局与位置控制方法

    Android开发实现popupWindow弹出窗口自定义布局与位置控制方法 Android开发实现popupWindow弹出窗口自定义布局与位置控制方法是Android开发中非常重要的一部分,掌握了这项技术可以让开发者更好地控制弹出窗口的...

    安卓popupwindow相关-androidpopwindow结合fragment实现左侧下拉菜单.rar

    4. 使用`showAsDropDown()`或`showAtLocation()`方法来显示`PopupWindow`,指定相对于哪个View的位置。 5. 添加监听器来处理用户交互,比如点击菜单项后的回调。 接着,关于`Fragment`的使用。`Fragment`是Android...

    Android 仿大众点评筛选框.zip

    2. **PopupWindow与PopupMenu**:在Android中,PopupWindow和PopupMenu是实现弹出菜单的两种常见方式。PopupWindow允许开发者自定义更复杂的视图,而PopupMenu则更简单,适合快速创建简单的下拉菜单。在这个项目中,...

    Android应用源码之仿微信标题栏右上角PopupWindow.zip

    2. `PopupMenu`: 一种更方便创建弹出菜单的类,但在这里可能未被使用,因为要完全模仿微信样式,所以选择了PopupWindow。 3. `PopupWindow`: 创建和管理弹出窗口。 4. `inflate()`: 将XML布局文件转换为View对象。 5...

    Android使用列表弹窗的代码例子

    本示例将探讨如何在Android应用中使用`PopupMenu`和`PopupWindow`来实现这样的功能。 首先,我们来看`PopupMenu`。`PopupMenu`是Android SDK中的一个内置组件,它允许开发者在某个View旁边弹出一个菜单,这个菜单...

    PopView的使用和View显示在其他程序中

    至于“工具”,可能指的是使用某些辅助工具或库来更方便地使用PopupWindow,比如第三方库`androidx.core.widget.PopupMenu`,它简化了创建右键菜单的操作,或者使用`Material Design`库中的`BottomSheetBehavior`来...

Global site tag (gtag.js) - Google Analytics