当前位置: 代码迷 >> Android >> android中应用PopupWindow实现弹出窗口菜单
  详细解决方案

android中应用PopupWindow实现弹出窗口菜单

热度:28   发布时间:2016-05-01 13:10:12.0
android中使用PopupWindow实现弹出窗口菜单

结合上篇android中使用ViewPager实现图片拖动,我们实现了点击“帮助”按钮的功能,这一篇则是接着上一篇,让我们一起来完成“我的”按钮的功能,这一功能,则是使用PopupWindow来实现弹出菜单。

 

老习惯,先上效果图:


  图一

 



  图二

 

 

再上项目结构图,如图:

 

 


从项目结构图可见,我们这里并没有新建新的Activity,因为“我的”按钮和“帮助”是在一个页面的,所以,我们只需新建一个效果图中的,弹出菜单的布局文件即可,即popup_menu.xml,代码如下:

 

Xml代码 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="wrap_content"  
  4.     android:layout_height="wrap_content"  
  5.     android:orientation="vertical"  
  6.     <span style="background-color: #99cc00;">android:background="@drawable/popu_menu"</span>  
  7.     android:paddingLeft="1dip"  
  8.     android:paddingRight="1dip"  
  9.     android:paddingTop="1dip"  
  10.     android:paddingBottom="14dip">  
  11.     <Button    
  12.             android:id="@+id/btn_my_favorites"    
  13.             android:layout_width="fill_parent"    
  14.             android:layout_height="wrap_content"    
  15.             android:gravity="center"    
  16.             android:text="我的喜爱"    
  17.             android:layout_weight="1"    
  18.               
  19.             android:textSize="15sp"    
  20.             android:textColor="@android:color/white"  
  21.             <span style="background-color: #99cc00;">android:background="@drawable/button4"</span>  
  22.             android:textStyle="bold" />    
  23.           
  24.         <View     
  25.             android:layout_width="fill_parent"    
  26.             android:layout_height="0.5dip"    
  27.             android:background="#eee" />  
  28.   
  29.         <Button  
  30.             android:id="@+id/btn_my_correction"  
  31.             android:layout_width="fill_parent"  
  32.             android:layout_height="wrap_content"  
  33.             android:layout_weight="1"  
  34.             <span style="background-color: #99cc00;">android:background="@drawable/button4"</span>  
  35.             android:gravity="center"  
  36.              
  37.             android:text="我的收藏"  
  38.             android:textColor="@android:color/white"  
  39.             android:textSize="15sp"  
  40.             android:textStyle="bold" />  
  41.     
  42.           <View     
  43.             android:layout_width="fill_parent"    
  44.             android:layout_height="0.5dip"    
  45.             android:background="#eee" />  
  46.            <Button    
  47.             android:id="@+id/btn_my_evaluation"    
  48.             android:layout_width="fill_parent"    
  49.             android:layout_height="wrap_content"    
  50.            <span style="background-color: #99cc00;"> android:background="@drawable/button4"</span>  
  51.             android:gravity="center"    
  52.                
  53.             
  54.             android:layout_weight="1"    
  55.             android:text="我的评价"    
  56.             android:textSize="15sp"    
  57.             android:textColor="@android:color/white"  
  58.             android:textStyle="bold"   
  59.             android:focusable="true"/>    
  60.  </LinearLayout>  
 

 


上面标记为绿色的代码,即是我对弹出菜单的一些背景和按钮的修饰,否则原始的效果很难受。

@drawable/popu_menu,popu_menu是一张图片,也就是弹出菜单的一张棕色的背景图,这个我就不上传附件了,大家随意换一张就行。

@drawable/button4,button4则是一个修饰原生button的xml文件,放置在drawable-hdpi这个文件夹,跟图片一起,代码如下:(颜色大家就自己配置吧,也就是我这里的android:drawable="XXXX",我就偷下懒了....)

button4.xml:

 

Xml代码 
  1. <?xml version="1.0" encoding="utf-8" ?>    
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">    
  3. <!-- 没有焦点时的背景颜色 -->    
  4. <item android:state_window_focused="false"  android:drawable="@color/buttonBg"/>    
  5. <!-- 非触摸模式下获得焦点并单击时的背景颜色 -->    
  6. <item android:state_focused="true" android:state_pressed="true"    
  7. android:drawable="@color/main_color" />    
  8. <!--触摸模式下单击时的背景颜色  -->    
  9. <item android:state_focused="false" android:state_pressed="true"    
  10. android:drawable="@color/main2_color" />   
  11. <!--获得焦点时的背景  颜色-->    
  12. <item android:state_focused="true" android:drawable="@color/main2_color" />    
  13. </selector>    

 

 

 

最后,图片和布局都准备好了之后,就是在MainActivity.java中去编写代码了,具体流程则是先找到这个按钮,然后绑定事件,最后运行就可以了。代码如下:

Mainactivity.java:

 

Java代码 
  1. package com.test.citylist;  
  2.   
  3. import android.app.Activity;  
  4. import android.app.AlertDialog;  
  5. import android.content.Context;  
  6. import android.content.DialogInterface;  
  7. import android.content.Intent;  
  8. import android.graphics.drawable.BitmapDrawable;  
  9. import android.net.Uri;  
  10. import android.os.Bundle;  
  11. import android.view.LayoutInflater;  
  12. import android.view.Menu;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.Button;  
  16. import android.widget.PopupWindow;  
  17.   
  18. public class MainActivity extends Activity implements OnClickListener{  
  19.   
  20.     private Button btn_help,btn_menu;  
  21.     private PopupWindow popupMenu;  
  22.       
  23.     public void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.activity_main);  
  26.           
  27.         //注册控件并绑定事件  
  28.         btn_help=(Button)findViewById(R.id.btn_help);//这个是上篇文章中的帮助按钮  
  29.         btn_menu=(Button)findViewById(R.id.btn_my_menu);//这个是本篇的菜单按钮  
  30.         btn_help.setOnClickListener(this);  
  31.         btn_menu.setOnClickListener(this);  
  32.     }  
  33.     @Override  
  34.     public boolean onCreateOptionsMenu(Menu menu) {  
  35.         getMenuInflater().inflate(R.menu.activity_main, menu);  
  36.         return true;  
  37.     }  
  38.   
  39.     @Override  
  40.     public void onClick(View v) {  
  41.         // TODO Auto-generated method stub  
  42.         switch (v.getId()) {  
  43.         case R.id.btn_help:  
  44.             Intent intent=new Intent();  
  45.             intent.setClass(MainActivity.this, HelpActivity.class);  
  46.             startActivity(intent);  
  47.             break;  
  48.           
  49.         case R.id.btn_my_menu:  
  50.             initPopupMenu();//调用弹出菜单  
  51.             break;  
  52.         default:  
  53.             break;  
  54.         }  
  55.     }  
  56.   
  57.       
  58.     //点击我的菜单  
  59.     private void initPopupMenu(){  
  60.         if(popupMenu==null){  
  61.              LayoutInflater lay = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);      
  62.              View v = lay.inflate(R.layout.popup_menu, null);      
  63.              //点击我的喜爱  
  64.              ((Button)v.findViewById(R.id.btn_my_favorites)).setOnClickListener(new OnClickListener(){  
  65.                 @Override  
  66.                 public void onClick(View view) {  
  67.                     popupMenu.dismiss();  
  68.                     Intent intent=new Intent(MainActivity.this,MainActivity.class);  
  69.                     startActivity(intent);  
  70.                 }  
  71.             });  
  72.              //点击我的收藏  
  73.              ((Button)v.findViewById(R.id.btn_my_correction)).setOnClickListener(new OnClickListener(){  
  74.                 @Override  
  75.                 public void onClick(View view) {  
  76.                     popupMenu.dismiss();  
  77.                     Intent intent=new Intent(MainActivity.this,MainActivity.class);  
  78.                     startActivity(intent);  
  79.                 }  
  80.             });  
  81.              //点击我的评价  
  82.              ((Button)v.findViewById(R.id.btn_my_evaluation)).setOnClickListener(new OnClickListener(){  
  83.                 @Override  
  84.                 public void onClick(View view) {  
  85.                     popupMenu.dismiss();  
  86.                     Intent intent=new Intent(MainActivity.this,MainActivity.class);  
  87.                     startActivity(intent);  
  88.                 }  
  89.             });  
  90.       
  91.              popupMenu = new PopupWindow(v, getApplicationContext().getResources().getDisplayMetrics().widthPixels/3,  
  92.                                             getApplicationContext().getResources().getDisplayMetrics().heightPixels/4 , true);  
  93.         }  
  94.          //设置整个popupwindow的样式。      
  95.          popupMenu.setBackgroundDrawable(new BitmapDrawable());      
  96.          //使窗口里面的空间显示其相应的效果,比较点击button时背景颜色改变。      
  97.          //如果为false点击相关的空间表面上没有反应,但事件是可以监听到的。      
  98.          //listview的话就没有了作用。      
  99.          popupMenu.setFocusable(true);      
  100.          popupMenu.setOutsideTouchable(true);  
  101.          popupMenu.update();     
  102.   
  103.          popupMenu.showAsDropDown(btn_menu);  
  104.     }  
  105. }  

 

到这里,运行代码,就可以看到效果图所示效果了,说做事要有始有终,既然我的这个页面上的两个按钮的功能已经分别实现了,那么最后一个“分享”按钮,我也不愿把它落下,那么点击“分享”后,是什么效果,用什么实现,请大家关注我的下一篇文章。


      相关解决方案