Android學習筆記————定製Menu(popupWindow實現)

來源:互聯網
上載者:User

首先申明,這不一定是最好的方法,android為我們提供了其他定製menu菜單的方法。但是用popupWindow來實現的話,可以實現一些更加特色的功能,當然只有你想不到,沒有做不到。

本文參考hellogv的文章http://blog.csdn.net/hellogv/article/details/6168439,不過本文中的例子更加簡單,並且,解決了前文沒有注意的一些問題。

想實現此項功能此前,需對PopupWindow的用法有個基本瞭解,這樣在看代碼的時候會更加輕鬆。

言歸正傳,首先,我們需要在res檔案夾下,建立anim檔案夾,這是存放Animation檔案的地方。在這裡我們建立兩個檔案,popup_enter.xml和popup_exit.xml分別對應popupwindow進入和退出時執行的動作。

popup_enter.xml的代碼如下:

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">    <translate android:fromYDelta="100%" android:toYDelta="0" android:duration="1000"/>    <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="1000"/></set>

popup_exit.xml的代碼如下:

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">    <translate android:fromYDelta="0" android:toYDelta="100%" android:duration="1000"/>    <alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="1000"/></set>

接下來在values檔案夾下建立popup_animation.xml檔案:

<?xml version="1.0" encoding="utf-8"?><resources>    <style name="PopupAnimation" parent="android:Animation">        <item name="android:windowEnterAnimation">@anim/popup_enter</item>        <item name="android:windowExitAnimation">@anim/popup_exit</item>    </style></resources>

接下來就是我們的重頭戲了,一個繼承自PopupWindow的類,MyMenu。先看代碼:

package com.csy.custommenudemo;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import android.content.Context;import android.view.KeyEvent;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnKeyListener;import android.view.WindowManager.LayoutParams;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.GridView;import android.widget.LinearLayout;import android.widget.PopupWindow;import android.widget.SimpleAdapter;public class MyMenu extends PopupWindow {private Context mContext;private LinearLayout mLinearLayout;private GridView mGridView;private String[] titles = {"工具","協助","關於","主題","設定","退出"};private List<HashMap<String,Object>> itemList = new ArrayList<HashMap<String,Object>>();private SimpleAdapter adapter;private LayoutInflater inflater;public MyMenu(Context context){super(context);mContext = context;initDatas();initViewInWin();//1.這裡要設定為true,否則將無法響應popupWindow中控制項的點擊事件。this.setFocusable(true);//這裡用上了我們在popupWindow中定義的animation了this.setAnimationStyle(R.style.PopupAnimation);this.setOutsideTouchable(true);this.setContentView(mLinearLayout);this.setWidth(LayoutParams.FILL_PARENT);this.setHeight(LayoutParams.WRAP_CONTENT);}/** * 初始化popupWindow中的內容 */public void initViewInWin(){inflater = (LayoutInflater)mContext.getSystemService(mContext.LAYOUT_INFLATER_SERVICE);mLinearLayout = (LinearLayout)inflater.inflate(R.layout.my_menu, null);//2.這裡需要設定成可以擷取焦點,否則無法響應OnKey事件mLinearLayout.setFocusable(true);mLinearLayout.setFocusableInTouchMode(true);//3.在這裡設定,即可實現關閉的效果。mLinearLayout.setOnKeyListener(new LayouOnKeyEvent());mGridView = (GridView)mLinearLayout.findViewById(R.id.menu_gridView);//設定item點擊響應的時間mGridView.setOnItemClickListener(new OnItemClickEvent());mGridView.setAdapter(adapter);}/** * 初始化資料內容 */public void initDatas(){for(int i = 0; i<titles.length; i++){HashMap<String,Object> map = new HashMap<String, Object>();map.put("image", R.drawable.ic_launcher);map.put("title", titles[i]);itemList.add(map);}adapter = new SimpleAdapter(mContext, itemList, R.layout.menu_item,new String[]{"image","title"}, new int[]{R.id.item_image,R.id.item_title});}class LayouOnKeyEvent implements OnKeyListener{@Overridepublic boolean onKey(View v, int keyCode, KeyEvent event) {// TODO Auto-generated method stub//判斷事件為menu按鈕按下時,將popupWindow關閉if(event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_MENU){if(MyMenu.this.isShowing()){MyMenu.this.dismiss();}}return false;}}class OnItemClickEvent implements OnItemClickListener{@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {// TODO Auto-generated method stub}}}

這裡我詳細說明一下重點標記的三點:

1.這個很容易理解,如果MyMenu無法獲得焦點的話,自然不能響應它上面控制項的事件了。

2.剛開始看hellogv的文章的時候沒有把這個問題當一回事,既然想要“冒充”menu,只需要在Activity中的onKeyDown方法中進行相應的判斷,關閉的時候就開啟,開啟的時候就關閉。可是問題來了,開啟是實現了,可是關不了.....這可讓我犯糊塗了,於是上網查,哦~~~~~原來android對menu按鈕有特殊的“攔截制度”,但是這個“攔截制度“著實讓我看的有點糊塗了。好不容易找打一個人有相同的問題卻沒有解決.....最後,還是讓我找到了答案(嘻嘻),原來在popupWindow顯示的時候,焦點被它取得了,那麼activity中的onKey方法自然無法響應了。問題就在這,那麼我們應該怎麼解決呢?

解決的方法很簡單,我們只需要給popupWindow中的View加上onKey方法,並且讓它能夠擷取焦點就可以了!例子中是讓mLinearLayout來實現的。並且達到了我們要的效果。

3.這裡自然是給mLinearLayout設定事件監聽了。

接下來就是主介面CustomMenuDemoActivity的代碼了。

package com.csy.custommenudemo;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.Gravity;import android.view.KeyEvent;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class CustomMenuDemoActivity extends Activity {private Button showBtn;MyMenu myMenu;    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        myMenu = new MyMenu(CustomMenuDemoActivity.this);        myMenu.setAnimationStyle(R.style.PopupAnimation);            }        @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {switch(keyCode){case KeyEvent.KEYCODE_MENU:if(myMenu.isShowing()){myMenu.dismiss();}else{myMenu.showAtLocation(findViewById(R.id.main_layout), Gravity.BOTTOM, 0, 0);}}return false;    }}

那麼這樣,我們就實現了一個用popupWindow定製的menu,並且可以通過menu按鍵,實現正常開啟和關閉。

附上源碼地址:http://download.csdn.net/download/chenshaoyang0011/4046142

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.