轉自:http://www.cyqdata.com/android/article-detail-25069
在Android開發中,時不時的可能要彈出出個視窗,本文為你介紹Android PopupWindow彈窗方面的相關知識,其實Android PopupWindow彈窗,也和AlertDialog對話方塊類似,本文就先介紹Android PopupWindow彈窗的相關內容,下面請看教程:
首先:初始化一個Android PopupWindow
PopupWindow mPop = new PopupWindow(getLayoutInflater().inflate(R.layout.window, null), LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
實現PopupWindow的建構函式,第一個參數匯入布局,後面兩個指定寬和高。彈窗一般有兩種展示方法,用showAsDropDown()和showAtLocation()兩種方法實現。一般參數有兩種,有位移和無位移。
bt1.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { initPopWindow(); mPop.showAsDropDown(v);//以這個Button為anchor(可以理解為錨,基準),在下方彈出 }}); bt2.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { initPopWindow(); mPop.showAsDropDown(v,20,-20);//橫軸位移20,縱軸-20,一個狀態列的長度 }}); bt3.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { initPopWindow(); mPop.showAtLocation(PopWindow.this.findViewById(R.id.rl), Gravity.CENTER, 0, 0);//在螢幕置中,無位移 }}); bt4.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { initPopWindow(); mPop.showAtLocation(PopWindow.this.findViewById(R.id.rl), Gravity.TOP | Gravity.LEFT, 20, 20);//在螢幕頂部|居右,帶位移 }}); bt5.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { if (mPop != null) { mPop.dismiss(); } }});
其中initPopWindow()方法來初始化一個彈窗
private void initPopWindow() { if (mPop == null) { mPop = new PopupWindow(getLayoutInflater().inflate(R.layout.pop, null), LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); } if (mPop.isShowing()) { mPop.dismiss(); } }
這裡定義了4個按鈕來呈現展示效果,一個按鈕用來關閉,來看下第三個按鈕點擊效果,就不一一了,大家可以自己試下。
看過我以前這系列部落格的朋友就會發現,PopupWindow裡面的布局就是抽屜裡面用的布局,後面的背景就是上篇部落格講的可延伸映像。為什麼用這個呢,我們來看下UC的menu效果
可能這個是用AlertDialog做的,但是用PopupWindow也非常方便。很多的應用都使用了這樣的menu。這裡我就不去仿照UC來做了,就用上面那個布局,原理是一樣的,換換圖片就行。
要做的很簡單,看代碼
public boolean onKeyDown(int keyCode, KeyEvent event){ //截獲按鍵事件 if(keyCode == KeyEvent.KEYCODE_MENU){ initPopWindow(); mPop.showAtLocation(this.findViewById(R.id.rl), Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0); //在螢幕底部 }else if(keyCode == KeyEvent.KEYCODE_BACK){ if(mPop.isShowing()){ mPop.dismiss(); }else{ System.exit(0); } } return false; }
看下效果
圖片似乎不是很給力,大家搞點漂亮點的圖片就可以了。
我把這個代碼全部貼出來
1 package com.notice.popWindow; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.view.Gravity; 6 import android.view.KeyEvent; 7 import android.view.View; 8 import android.view.View.OnClickListener; 9 import android.view.ViewGroup.LayoutParams; 10 import android.widget.Button; 11 import android.widget.GridView; 12 import android.widget.PopupWindow; 13 14 public class PopWindow extends Activity { 15 private GridView gv; 16 private Button bt1; 17 private Button bt2; 18 private Button bt3; 19 private Button bt4; 20 private Button bt5; 21 private int[] icons={R.drawable.browser,R.drawable.gallery, 22 R.drawable.camera,R.drawable.gmail, 23 R.drawable.music,R.drawable.market, 24 R.drawable.phone,R.drawable.messages,R.drawable.maps}; 25 private String[] items={"瀏覽器","圖片","相機","時鐘","音樂","市場","撥號","資訊","地圖"}; 26 private PopupWindow mPop; 27 private View layout; 28 private void initPopWindow() { 29 if (mPop == null) { 30 mPop = new PopupWindow(layout, 31 LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 32 } 33 if (mPop.isShowing()) { 34 mPop.dismiss(); 35 } 36 } 37 /** Called when the activity is first created. */ 38 @Override 39 public void onCreate(Bundle savedInstanceState) { 40 super.onCreate(savedInstanceState); 41 setContentView(R.layout.main); 42 bt1 = (Button)findViewById(R.id.bt1); 43 bt2 = (Button)findViewById(R.id.bt2); 44 bt3 = (Button)findViewById(R.id.bt3); 45 bt4 = (Button)findViewById(R.id.bt4); 46 bt5 = (Button)findViewById(R.id.bt5); 47 layout = View.inflate(this, R.layout.window, null); 48 gv = (GridView) layout.findViewById(R.id.gv); 49 MyAdapter adapter=new MyAdapter(this,items,icons); 50 gv.setAdapter(adapter); 51 52 bt1.setOnClickListener(new OnClickListener(){ 53 54 @Override 55 public void onClick(View v) { 56 initPopWindow(); 57 mPop.showAsDropDown(v);//以這個Button為anchor(可以理解為錨,基準),在下方彈出 58 59 }}); 60 61 bt2.setOnClickListener(new OnClickListener(){ 62 63 @Override 64 public void onClick(View v) { 65 initPopWindow(); 66 mPop.showAsDropDown(v,20,-20);//橫軸位移20,縱軸-20,一個狀態列的長度 67 68 }}); 69 70 bt3.setOnClickListener(new OnClickListener(){ 71 72 @Override 73 public void onClick(View v) { 74 initPopWindow(); 75 mPop.showAtLocation(PopWindow.this.findViewById(R.id.rl), 76 Gravity.CENTER, 0, 0);//在螢幕置中,無位移 77 78 }}); 79 80 81 bt4.setOnClickListener(new OnClickListener(){ 82 83 @Override 84 public void onClick(View v) { 85 initPopWindow(); 86 mPop.showAtLocation(PopWindow.this.findViewById(R.id.rl), 87 Gravity.TOP | Gravity.LEFT, 20, 20);//在螢幕頂部|居右,帶位移 88 89 }}); 90 91 bt5.setOnClickListener(new OnClickListener(){ 92 93 @Override 94 public void onClick(View v) { 95 if (mPop != null) { 96 mPop.dismiss(); 97 } 98 99 }});100 101 }102 public boolean onKeyDown(int keyCode, KeyEvent event){103 //截獲按鍵事件104 if(keyCode == KeyEvent.KEYCODE_MENU){105 initPopWindow();106 mPop.showAtLocation(this.findViewById(R.id.rl),107 Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0); //在螢幕底部108 }else if(keyCode == KeyEvent.KEYCODE_BACK){109 if(mPop.isShowing()){110 mPop.dismiss();111 }else{112 System.exit(0);113 }114 115 }116 return false;117 118 }119 }
其中的MyAdapter類可以去看我以前的一篇寫抽屜的部落格,代碼都在裡面。然後就是window.xml
<?xml version="1.0" encoding="utf-8"?> <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gv" android:background="@drawable/tbg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:numColumns="3" android:gravity="center"> </GridView>
只有一個GridView。main.xml就不貼了,就幾個Button。