【Android进阶学习】Popupwindow的应用

简介:

PopupWindow 是一种阻塞式的弹出窗口,这就意味着在我们退出这个弹出框之前,程序会一直等待。它可以浮动在当前Activity的任何的位置上。 需要注意的是,PopupWindow必须触发某个焦点或者某个事件才会显示出来,不然总会会出现错误。

下面是使用PopupWindow 弹出自定义菜单的例子

当我们点击Menu键的时候,会在当前的Activity最下方弹出一个菜单。

效果图如下:

 PopupMenuDemo.java


 
 
  1. package com.lingdududu.popupWindow;  
  2.  
  3. import android.app.Activity;  
  4. import android.content.Context;  
  5. import android.graphics.drawable.BitmapDrawable;  
  6. import android.os.Bundle;  
  7. import android.view.Gravity;  
  8. import android.view.KeyEvent;  
  9. import android.view.LayoutInflater;  
  10. import android.view.Menu;  
  11. import android.view.MenuItem;  
  12. import android.view.View;  
  13. import android.view.ViewGroup;  
  14. import android.widget.BaseAdapter;  
  15. import android.widget.GridView;  
  16. import android.widget.ImageView;  
  17. import android.widget.LinearLayout;  
  18. import android.widget.PopupWindow;  
  19. import android.widget.TextView;  
  20. import android.widget.LinearLayout.LayoutParams;  
  21.  
  22. public class PopupMenuDemo extends Activity {  
  23.       
  24.     private int[] resArray = new int[] {  
  25.             R.drawable.icon_menu_addto, R.drawable.icon_menu_audioinfo,  
  26.             R.drawable.icon_menu_findlrc, R.drawable.icon_menu_scan  
  27.     };  
  28.       
  29.     private String[] title = new String[]{  
  30.             "添加""信息""搜索""查看" 
  31.     };  
  32.       
  33.     private PopupWindow pw = null;  
  34.       
  35.     /** Called when the activity is first created. */ 
  36.     @Override 
  37.     public void onCreate(Bundle savedInstanceState) {  
  38.         super.onCreate(savedInstanceState);  
  39.         setContentView(R.layout.main);  
  40.     }  
  41.       
  42.  
  43.     @Override 
  44.     public boolean onCreateOptionsMenu(Menu menu) {  
  45.         menu.add("");  
  46.         return super.onCreateOptionsMenu(menu);  
  47.           
  48.     }  
  49.       
  50.     /**  
  51.      * 在此方法中实现自定义菜单栏  
  52.      */ 
  53.     public boolean onMenuOpened(int featureId, Menu menu) {  
  54.         if (pw != null) {  
  55.             if (pw.isShowing()) {  
  56.                 // 就关闭弹出窗口  
  57.                 pw.dismiss();  
  58.             }   
  59.             else {  
  60.                 //在指定位置弹出窗口  
  61.                 pw.showAtLocation(findViewById(R.id.tv), Gravity.CENTER, 0300);  
  62.             }  
  63.         }   
  64.         else {  
  65.  
  66.             LayoutInflater inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);        
  67.             View view = inflater.inflate(R.layout.menu, null);  
  68.             GridView grid1 = (GridView)view.findViewById(R.id.menuGridChange);  
  69.             grid1.setAdapter(new ImageAdapter(this));  
  70.               
  71.               
  72.             //生成PopupWindow对象  
  73.             pw = new PopupWindow(view,LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);  
  74.               
  75.             //在指定位置弹出窗口  
  76.             pw.showAtLocation(findViewById(R.id.tv), Gravity.CENTER, 0300);  
  77.  
  78.         }  
  79.         // 此处返回false,系统不会执行onCreateOptionsMenu中添加的菜单  
  80.         return false;  
  81.     }  
  82.  
  83.  
  84.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  85.           
  86.         if(keyCode==KeyEvent.KEYCODE_BACK){  
  87.             pw.dismiss();  
  88.             return false;  
  89.         }  
  90.         return super.onKeyDown(keyCode, event);  
  91.     }  
  92.     @Override 
  93.     public boolean onOptionsItemSelected(MenuItem item) {  
  94.         return super.onOptionsItemSelected(item);  
  95.     }  
  96.  
  97.  
  98.     public class ImageAdapter extends BaseAdapter {  
  99.           
  100.         private Context context;  
  101.           
  102.         public ImageAdapter(Context context) {  
  103.             this.context = context;  
  104.         }  
  105.           
  106.         @Override 
  107.         public int getCount() {  
  108.             return resArray.length;  
  109.         }  
  110.  
  111.         @Override 
  112.         public Object getItem(int arg0) {  
  113.             return resArray[arg0];  
  114.         }  
  115.  
  116.         @Override 
  117.         public long getItemId(int arg0) {  
  118.             return arg0;  
  119.         }  
  120.  
  121.         @Override 
  122.         public View getView(int arg0, View arg1, ViewGroup arg2) {  
  123.             LinearLayout linear = new LinearLayout(context);  
  124.             LinearLayout.LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);  
  125.             linear.setOrientation(LinearLayout.VERTICAL);  
  126.               
  127.             ImageView iv = new ImageView(context);  
  128.             iv.setImageBitmap(((BitmapDrawable)context.getResources().getDrawable(resArray[arg0])).getBitmap());  
  129.             LinearLayout.LayoutParams params2 = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);  
  130.             params2.gravity=Gravity.CENTER;  
  131.             linear.addView(iv, params2);  
  132.               
  133.             TextView tv = new TextView(context);  
  134.             tv.setText(title[arg0]);  
  135.             LinearLayout.LayoutParams params3 = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);  
  136.             params3.gravity=Gravity.CENTER;  
  137.               
  138.             linear.addView(tv, params3);  
  139.               
  140.             return linear;  
  141.         }  
  142.     }  

main.xml


 
 
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:orientation="vertical" 
  4.     android:layout_width="fill_parent" 
  5.     android:layout_height="fill_parent" 
  6.     > 
  7. <TextView    
  8.     android:id="@+id/tv" 
  9.     android:layout_width="fill_parent"   
  10.     android:layout_height="wrap_content"   
  11.     android:text="@string/hello" 
  12.     /> 
  13. </LinearLayout> 

menu.xml


 
 
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:orientation="vertical" 
  4.     android:layout_width="fill_parent" 
  5.     android:layout_height="fill_parent" 
  6.     > 
  7. <TextView    
  8.     android:id="@+id/tv" 
  9.     android:layout_width="fill_parent"   
  10.     android:layout_height="wrap_content"   
  11.     android:text="@string/hello" 
  12.     /> 
  13. </LinearLayout> 

 

menu_bg_frame.xml 这个文件是菜单背景的样式文件,在drawable-hdpi文件下面


 
 
  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <shape android:shape="rectangle" xmlns:android="http://schemas.android.com/apk/res/android"> 
  3.     <solid android:color="#b4000000" /> 
  4.     <stroke android:width="2.0dip" android:color="#b4ffffff" android:dashWidth="3.0dip" android:dashGap="0.0dip" /> 
  5.     <padding android:left="7.0dip" android:top="7.0dip" android:right="7.0dip" android:bottom="7.0dip" /> 
  6.     <corners android:radius="8.0dip" /> 
  7. </shape> 

 

本文转自 lingdududu 51CTO博客,原文链接: 

http://blog.51cto.com/liangruijun/739459




相关文章
|
2月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
261 4
|
1月前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
70 14
|
1月前
|
Java Linux 数据库
探索安卓开发:打造你的第一款应用
在数字时代的浪潮中,每个人都有机会成为创意的实现者。本文将带你走进安卓开发的奇妙世界,通过浅显易懂的语言和实际代码示例,引导你从零开始构建自己的第一款安卓应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇门,让你的创意和技术一起飞扬。
|
1月前
|
搜索推荐 前端开发 测试技术
打造个性化安卓应用:从设计到开发的全面指南
在这个数字时代,拥有一个定制的移动应用不仅是一种趋势,更是个人或企业品牌的重要延伸。本文将引导你通过一系列简单易懂的步骤,从构思你的应用理念开始,直至实现一个功能齐全的安卓应用。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你提供必要的工具和知识,帮助你将创意转化为现实。
|
1月前
|
Java Android开发 开发者
探索安卓开发:构建你的第一个“Hello World”应用
在安卓开发的浩瀚海洋中,每个新手都渴望扬帆起航。本文将作为你的指南针,引领你通过创建一个简单的“Hello World”应用,迈出安卓开发的第一步。我们将一起搭建开发环境、了解基本概念,并编写第一行代码。就像印度圣雄甘地所说:“你必须成为你希望在世界上看到的改变。”让我们一起开始这段旅程,成为我们想要见到的开发者吧!
45 0
|
2月前
|
JSON Java Android开发
探索安卓开发之旅:打造你的第一个天气应用
【10月更文挑战第30天】在这个数字时代,掌握移动应用开发技能无疑是进入IT行业的敲门砖。本文将引导你开启安卓开发的奇妙之旅,通过构建一个简易的天气应用来实践你的编程技能。无论你是初学者还是有一定经验的开发者,这篇文章都将成为你宝贵的学习资源。我们将一步步地深入到安卓开发的世界中,从搭建开发环境到实现核心功能,每个环节都充满了发现和创造的乐趣。让我们开始吧,一起在代码的海洋中航行!
|
2月前
|
存储 搜索推荐 Java
打造个性化安卓应用:从设计到实现
【10月更文挑战第30天】在数字化时代,拥有一个个性化的安卓应用不仅能够提升用户体验,还能加强品牌识别度。本文将引导您了解如何从零开始设计和实现一个安卓应用,涵盖用户界面设计、功能开发和性能优化等关键环节。我们将以一个简单的记事本应用为例,展示如何通过Android Studio工具和Java语言实现基本功能,同时确保应用流畅运行。无论您是初学者还是希望提升现有技能的开发者,这篇文章都将为您提供宝贵的见解和实用的技巧。
|
2月前
|
搜索推荐 开发工具 Android开发
打造个性化Android应用:从设计到实现的旅程
【10月更文挑战第26天】在这个数字时代,拥有一个能够脱颖而出的移动应用是成功的关键。本文将引导您了解如何从概念化阶段出发,通过设计、开发直至发布,一步步构建一个既美观又实用的Android应用。我们将探讨用户体验(UX)设计的重要性,介绍Android开发的核心组件,并通过实际案例展示如何克服开发中的挑战。无论您是初学者还是有经验的开发者,这篇文章都将为您提供宝贵的见解和实用的技巧,帮助您在竞争激烈的应用市场中脱颖而出。
|
2月前
|
算法 Java 数据库
Android 应用的主线程在什么情况下会被阻塞?
【10月更文挑战第20天】为了避免主线程阻塞,我们需要合理地设计和优化应用的代码。将耗时操作移到后台线程执行,使用异步任务、线程池等技术来提高应用的并发处理能力。同时,要注意避免出现死循环、不合理的锁使用等问题。通过这些措施,可以确保主线程能够高效地运行,提供流畅的用户体验。
89 2
|
3月前
|
Java API Android开发
安卓应用程序开发的新手指南:从零开始构建你的第一个应用
【10月更文挑战第20天】在这个数字技术不断进步的时代,掌握移动应用开发技能无疑打开了一扇通往创新世界的大门。对于初学者来说,了解并学习如何从无到有构建一个安卓应用是至关重要的第一步。本文将为你提供一份详尽的入门指南,帮助你理解安卓开发的基础知识,并通过实际示例引导你完成第一个简单的应用项目。无论你是编程新手还是希望扩展你的技能集,这份指南都将是你宝贵的资源。
123 5

热门文章

最新文章