前一篇文章中有用到 PopupWindow 来实现弹窗的功能。简单介绍以下吧。

官方文档是这样解释的:这就是一个弹出窗口,可以用来显示一个任意视图。出现的弹出窗口是一个浮动容器的当前活动。

1.首先来个简单的栗子,效果如下:

只有两个布局文件,一个是弹窗布局(只有一张图片),一个是主界面布局(只有一个按钮)。

然后在主界面代码中实例 PopupWindow ,指定弹出的界面,在按钮点击事件中显示或隐藏弹窗就可以了,代码如下:

package com.yanis.demo;import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout.LayoutParams;
import android.widget.PopupWindow;public class PopupWindowActivity extends Activity {PopupWindow pop;Button btn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_popup_window);btn = (Button) findViewById(R.id.btnShowWindow);LayoutInflater inflater = LayoutInflater.from(this);// 引入窗口配置文件 - 即弹窗的界面View view = inflater.inflate(R.layout.my_popup_window, null);// PopupWindow实例化pop = new PopupWindow(view, LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT, false);btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if (pop.isShowing()) {// 隐藏窗口,如果设置了点击窗口外消失,则不需要此方式隐藏
                    pop.dismiss();} else {// 弹出窗口显示内容视图,默认以锚定视图的左下角为起点,这里为点击按钮
                    pop.showAsDropDown(v);}}});}
}

2.知道了怎么实现 PopupWindow 弹窗,利用其特性替换系统自带的菜单栏,来个仿腾讯新闻的菜单吧,效果图如下:

布局什么的花点时间,慢慢调,自然就出来了,主要还是主界面的逻辑代码啊,菜单就是通过 PopupWindow 来显示的,具体代码如下:

package com.yanis.popup_window;import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout.LayoutParams;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener,OnKeyListener {PopupWindow pop;TextView hideView;Button btnCancel;ImageView btnNight, btnWord, btnExit;View view;boolean isOut, isIn;// 是否弹窗显示
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initData();}/*** 初始化组件*/private void initView() {hideView = (TextView) findViewById(R.id.hideView);LayoutInflater inflater = LayoutInflater.from(this);// 引入窗口配置文件 - 即弹窗的界面view = inflater.inflate(R.layout.menu_view, null);btnNight = (ImageView) view.findViewById(R.id.btnNight);btnWord = (ImageView) view.findViewById(R.id.btnWord);btnExit = (ImageView) view.findViewById(R.id.btnExit);btnCancel = (Button) view.findViewById(R.id.btnCancel);}/*** 初始化数据*/private void initData() {btnNight.setOnClickListener(this);btnWord.setOnClickListener(this);btnExit.setOnClickListener(this);btnCancel.setOnClickListener(this);view.setFocusableInTouchMode(true);view.setOnKeyListener(this);// PopupWindow实例化pop = new PopupWindow(view, LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT, true);/*** PopupWindow 设置*/// pop.setFocusable(true); //设置PopupWindow可获得焦点// pop.setTouchable(true); //设置PopupWindow可触摸// pop.setOutsideTouchable(true); // 设置非PopupWindow区域可触摸// 设置PopupWindow显示和隐藏时的动画
        pop.setAnimationStyle(R.style.MenuAnimationFade);/*** 改变背景可拉的弹出窗口。后台可以设置为null。 这句话必须有,否则按返回键popwindow不能消失 或者加入这句话* ColorDrawable dw = new* ColorDrawable(-00000);pop.setBackgroundDrawable(dw);*/pop.setBackgroundDrawable(new BitmapDrawable());}/*** 按钮点击事件监听* * @param v*/@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btnNight:changePopupWindowState();Toast.makeText(MainActivity.this, "你点击了夜间模式", Toast.LENGTH_SHORT).show();break;case R.id.btnWord:changePopupWindowState();Toast.makeText(MainActivity.this, "你点击了文本模式", Toast.LENGTH_SHORT).show();break;case R.id.btnExit:exitTheDemo();break;case R.id.btnCancel:changePopupWindowState();break;}}/*** 退出程序*/private void exitTheDemo() {changePopupWindowState();new AlertDialog.Builder(MainActivity.this).setMessage("确定退出这个 Demo 吗?").setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {finish();}}).setNegativeButton("取消", null).show();}/*** 改变 PopupWindow 的显示和隐藏*/private void changePopupWindowState() {if (pop.isShowing()) {// 隐藏窗口,如果设置了点击窗口外消失,则不需要此方式隐藏
            pop.dismiss();} else {// 弹出窗口显示内容视图,默认以锚定视图的左下角为起点,这里为点击按钮pop.showAtLocation(hideView, Gravity.BOTTOM, 0, 0);}}// Called when a key was pressed down and not handled by any of the views// inside of the activity
    @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {switch (keyCode) {case KeyEvent.KEYCODE_MENU:// 菜单键监听isOut = true;changePopupWindowState();break;}return super.onKeyDown(keyCode, event);}// Called when a hardware key is dispatched to a view.
    @Overridepublic boolean onKey(View v, int keyCode, KeyEvent event) {switch (keyCode) {case KeyEvent.KEYCODE_MENU:if (isOut && !isIn) {isOut = false;isIn = true;} else if (!isOut && isIn) {isIn = false;changePopupWindowState();}break;}return false;}}

本文转自叶超Luka博客园博客,原文链接:http://www.cnblogs.com/yc-755909659/p/4288864.html,如需转载请自行联系原作者

【Android UI设计与开发】7.底部菜单栏(四)PopupWindow 实现显示仿腾讯新闻底部弹出菜单...相关推荐

  1. 【Android UI设计与开发】9:滑动菜单栏(一)开源项目SlidingMenu的使用和示例-转...

    一.SlidingMenu简介 相信大家对SlidingMenu都不陌生了,它是一种比较新的设置界面或配置界面的效果,在主界面左滑或者右滑出现设置界面效果,能方便的进行各种操作.很多优秀的应用都采用了 ...

  2. android qq右上加号,仿QQ空间点击加号弹出菜单特效

    最近项目需要,前几天写了一个仿微信相册(包括编辑相册)功能,审核代码的时候发现同事要实现一个类似仿QQ空间点击加号弹出菜单特效,于是看了一些他的代码,我发现虽然他实现了功能,但是不够完善,所以我又花了 ...

  3. 【Android UI设计与开发】第09期:底部菜单栏(四)Fragment+PopupWindow仿QQ空间最新版底部菜单栏

    转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9023451          在今天的这篇文章当中,我依然会以实战加理论结合 ...

  4. 【Android UI设计与开发】第02期:引导界面(二)使用ViewPager实现欢迎引导页面

    转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/8980917 本系列文章都会以一个程序的实例开发为主线来进行讲解,以求达到一个 ...

  5. android ui设计与开发工具,Android用户体验与UI设计

    Android用户体验与UI设计 编辑 锁定 讨论 上传视频 本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 本书是一部介绍Android用户体验.UI设计理念和方法论的作品 ...

  6. 【Android UI设计与开发】第06期:底部菜单栏(一)使用TabActivity实现底部菜单栏

    转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/8989063       从这一篇文章开始,我们将进入到一个应用程序主界面UI ...

  7. 【Android UI设计与开发】5.底部菜单栏(二)使用Fragment实现底部菜单栏

    既然 Fragment 取代了TabActivity,当然 TabActivity 的能实现的菜单栏,Fragment 当然也能实现.主要其实就是通过菜单栏的点击事件切换 Fragment 的显示和隐 ...

  8. 【Android UI设计与开发】第16期:滑动菜单栏(一)

    这期博主要给大家带来的是关于滑动菜单栏的实现效果. 一.SlidingMenu简介 相信大家对SlidingMenu都不陌生了,它是一种比较新的设置界面或配置界面的效果,在主界面左滑或者右滑出现设置界 ...

  9. 【Android UI设计与开发】第05期:引导界面(五)实现应用程序只启动一次引导界面

    转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/8987342  这篇文章算是对整个引导界面开发专题的一个终结了吧,个人觉得大部 ...

最新文章

  1. 面试题:2018最全Redis面试题整理
  2. 近期必读的6篇NeurIPS 2019零样本学习论文
  3. Go 语言编程 — 程序结构
  4. Keil中RO-data、RW-data、ZI-data意义
  5. Git与GitHub的使用
  6. c 语言中unsigned char类型变量占用内存大小,C数据类型
  7. Linux底层开发之四书五经
  8. 机器学习知识总结系列-机器学习中的数学-矩阵(1-3-2)
  9. 2021年中国养老前景调查报告
  10. Skip-Thought Vector —— 跳跃思维句表示
  11. python3打印不换行
  12. python虚拟环境搭建mac_在MAC上安装Python虚拟环境
  13. Java实现基于Socket的pbft算法
  14. 【数据分析】豆瓣电影Top250爬取的数据的可视化分析
  15. 给学弟建议的个人前端规划
  16. 联想计算机CDROM启动,光驱启动,联想电脑光驱启动
  17. 十六进制颜色码与RGB颜色值的转换
  18. 排列组合问题,01234 五个数能组成多少个互不相同的三位数,且数字不重复。
  19. mc服务器 领地插件配置文件,《我的世界》领地插件 领地插件详细使用教程
  20. Open vSwitch安装指定版本ovs

热门文章

  1. linux查看进程和线程的命令
  2. c++ 0.你好,世界
  3. IDEA配置git环境
  4. [攻防世界 pwn]——string(内涵peak小知识)
  5. c# mysql varbinary_Mysql中如何插入VarBinary二进制类型?
  6. Oracle中类似于isql或osql的命令行工具
  7. jQuery 源码分析笔记(3)
  8. SSH-keygen参数说明
  9. 耻辱的时间戳(笑哭)
  10. Oracle 创建dblink