Android用PopupWindow实现自定义overflow

本文实例为大家分享了PopupWindow实现自定义overflow的具体代码,供大家参考,具体内容如下

当Action Bar的Action放不下时,系统会将其收集在overflow中。

用hierarchyviewer查看系统自己生成的Overflow,发现它本身就是popupWindow。

所以我们也可以用popUpWindow来写自己的overflow实现更多功能,做出像微信一样的效果。

第一次写,废话有点多,还望多包涵。

效果(GIF演示在文章底部):

最右边的Action(那个三点菜单)是自己添加的Action,使用了android开发包里的图标ic_action_overflow.png,可到官网下载。

首先在Item中添加Action,为了演示,添加了一个Submenu

<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.popupwindowoverflow.MainActivity" >
<item
    android:id="@+id/action_new"
    android:orderInCategory="1"
    android:title="SubMenu"
    android:icon="@drawable/ic_action_new"
    app:showAsAction="always">
  <menu>
    <item android:id="@+id/submenu1"
      android:title="Accept"
      android:titleCondensed="Accept"
      android:icon="@drawable/ic_action_accept" />
     <item android:id="@+id/submenu2"
      android:title="Cancel"
      android:titleCondensed="Cancel"
      android:icon="@drawable/ic_action_cancel" />
     <item android:id="@+id/submenu3"
      android:title="Unread"
      android:titleCondensed="Unread"
      android:icon="@drawable/ic_action_unread" />
  </menu>
</item>
<item
    android:id="@+id/action_overflow"
    android:orderInCategory="2"
    android:title="PopupWindow"
    android:icon="@drawable/ic_action_overflow"
    app:showAsAction="always"/>

</menu>

监听ID为action_overflow的Action,创建popupWindow弹出自己的overflow。

public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    switch (id) {
    case R.id.action_overflow:
      popUpMyOverflow();//弹出自定义overflow
      return true;
    }
    return super.onOptionsItemSelected(item);
  }

下面介绍popUpMyOverflow()方法,就是通过它弹出了我们的overflow,自定义overflow的布局文件就是R.layout.action_overflow_popwindow,这里就不贴出来啦。

public void popUpMyOverflow() {
    /**
     * 定位PopupWindow,让它恰好显示在Action Bar的下方。 通过设置Gravity,确定PopupWindow的大致位置。
     * 首先获得状态栏的高度,再获取Action bar的高度,这两者相加设置y方向的offset样PopupWindow就显示在action
     * bar的下方了。 通过dp计算出px,就可以在不同密度屏幕统一X方向的offset.但是要注意不要让背景阴影大于所设置的offset,
     * 否则阴影的宽度为offset.
     */
    // 获取状态栏高度
    Rect frame = new Rect();
    getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
//    状态栏高度:frame.top
    int xOffset = frame.top+getActionBar().getHeight()-25;//减去阴影宽度,适配UI.
    int yOffset = Dp2Px(this, 5f); //设置x方向offset为5dp
    View parentView = getLayoutInflater().inflate(R.layout.activity_main,
        null);
    View popView = getLayoutInflater().inflate(
        R.layout.action_overflow_popwindow, null);
    PopupWindow popWind = new PopupWindow(popView,
        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, true);//popView即popupWindow的布局,ture设置focusAble.

    //必须设置BackgroundDrawable后setOutsideTouchable(true)才会有效。这里在XML中定义背景,所以这里设置为null;
    popWind.setBackgroundDrawable(new BitmapDrawable(getResources(),
        (Bitmap) null));
    popWind.setOutsideTouchable(true); //点击外部关闭。
    popWind.setAnimationStyle(android.R.style.Animation_Dialog);  //设置一个动画。
    //设置Gravity,让它显示在右上角。
    popWind.showAtLocation(parentView, Gravity.RIGHT | Gravity.TOP,
        yOffset, xOffset);
  }

在android中,为了适配不同屏幕密度和尺寸,android用了Dp单位,但是在Java代码中多是接受px单位的尺寸,所以这里要转换一下。

Dp转换Px的方法。

public int Dp2Px(Context context, float dp) {
   final float scale = context.getResources().getDisplayMetrics().density;
    return (int) (dp * scale + 0.5f);
  } 

好的,现在我们有了所有要显示自定义Overflow的东西了!运行你的app吧。

最终效果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android PopupWindow全屏详细介绍及实例代码

     Android PopupWindow全屏 很多应用中经常可以看到弹出这种PopupWindow的效果,做了一个小demo分享一下.demo的思路是通过遍历文件,找到图片以及图片文件夹放置在PopupWindow上面.点击按钮可以弹出这个PopupWindow,这里为PopupWindow设置了动画. PopupWindow全屏代码提要 受限需要自定义Popupwindow,这里不看Popupwindow里面要展示的内容,主要是设置Popupwindow的高度. public class Po

  • Android 使用PopupWindow实现弹出更多的菜单实例详解

    最近想要做一个弹出更多的菜单,而原生的弹出菜单却不是我们想要的效果,所以必然要自定义菜单咯.本人也是借鉴网上的资料进行封装的,感觉还蛮不错的. 原生的菜单如下图: 自定义之后的效果图: 是不是看到这里之后,对比可知,原生的效果不太理想,所以还是再自己定义吧! 1.PopupWindow可以说是一个浮动在Activity之上的容器,通常用来显示自定义的视图.弹出菜单的封装PopMenuMore /** * 对弹出菜单的封装. * http://blog.csdn.net/maosidiaoxian

  • Android自定义popupwindow实例代码

    先来看看效果图: 一.布局  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content&qu

  • Android popupwindow简单使用方法介绍

    先看下效果 1.首页 package com.yskj.jh.demopopupwindow; import android.content.Context; import android.graphics.drawable.BitmapDrawable; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.LayoutInflater; import and

  • Android组件popupwindow使用方法详解

    先看效果: 现在很多的应用效果都需要做的炫些,像UC,以及天天静听,效果很炫的,源码已经对外开放了,有兴趣的可以去研究下的 上源码 main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fi

  • android自定义popupwindow仿微信右上角弹出菜单效果

    微信右上角的操作菜单看起来很好用,就照着仿了一下,不过是旧版微信的,手里刚好有一些旧版微信的资源图标,给大家分享一下. 不知道微信是用什么实现的,我使用popupwindow来实现,主要分为几块内容: 1.窗口布局文件:popwin_share.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com

  • Android简单实现自定义弹框(PopupWindow)

    一:一般都是先上效果图 二:实现步骤: 1.xml布局实现 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height=&quo

  • android PopupWindow点击外部和返回键消失的解决方法

    刚接手PopupWindow的时候,我们都可能觉得很简单,因为它确实很简单,不过运气不好的可能就会踩到一个坑: 点击PopupWindow最外层布局以及点击返回键PopupWindow不会消失 新手在遇到这个问题的时候可能会折腾半天,最后通过强大的网络找到一个解决方案,那就是跟PopupWindow设置一个背景 popupWindow.setBackgroundDrawable(drawable),这个drawable随便一个什么类型的都可以,只要不为空. Demo地址:SmartPopupWi

  • Android自定义仿微信PopupWindow效果

    给大家分享一个高仿微信的PopupWindow.就是微信的扫一扫那个功能窗口.下面有应用运行效果图.更加直观的展示了Demo的效果.源代码是通过两种方法实现的.大家可以下载源代码研究研究.集成到自己的项目中也是很方便的.希望对大家有用.先看一下 Demo运行效果 本Demo是高仿的微信以前的版本.并不是最新版本.如果想改成最新版本的可稍做改动就ok了 第一种方式 初始化组件 private void initView(){ //实例化标题栏按钮并设置监听 titleBtn = (ImageBut

  • Android编程实现的自定义弹窗(PopupWindow)功能示例

    本文实例讲述了Android编程实现的自定义弹窗(PopupWindow)功能.分享给大家供大家参考,具体如下: 在开发过程中,如果要弹出一个对话框,一般是使用AlertDialog,但其使用限制太大,灵活性不够,所以我们常需要用到灵活性更高的PopupWindow, 如图,当点击显示的时候,就会弹出一个对话框,当点击确定或屏幕其它任意地方,就可以将PopupWindow取消了,接下来贴出重要代码. PopupWindow pw = new PopupWindow(view.getContext

  • Popupwindow 的简单实用案例(显示在控件下方)

    第一步: private PopupWindow mPopupWindow; 第二步:写一个popupwindow的布局文件XML <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_paren

随机推荐