0 Comments

模拟UCWeb效果菜单(1)

发布于:2012-11-20  |   作者:广州网站建设  |   已聚集:人围观
模拟UCWeb效果菜单(1)

工程目录:src\ch06\ch06_ucweb_menu

可能有很多读者使用过Android版的UCWeb(也称为UC浏览器)。在UCWeb的主界面可以弹出包含很多图像的菜单,如图6.10所示。广州网站建设

图6.10  UCWeb主界面
实际上,这个弹出菜单也是一个弹出窗口,本节将介绍如何弹出类似的菜单。在上一节介绍了通过onKeyDown事件来捕捉"menu"键盘事件来弹出菜单,本节将介绍另外一种弹出自定义菜单的方法,即通过onCreateOptionsMenu和onMenuOpened两个方法相互配合来弹出自定义菜单。onCreateOptionsMenu方法用于创建选项菜单,在显示选项菜单之前,系统会调用onMenuOpened方法,如果该方法返回false,则在onCreateOptionsMenu方法中创建的选项菜单将不再显示。因此,可以在onMenuOpened方法中弹出用于显示自定义菜单的窗口。本例的完整实现代码如下:
广州网站设计
  1. package mobile.android.ch06_ucweb.menu;  
  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.Menu;  
  8. import android.view.View;  
  9. import android.view.View.OnKeyListener;  
  10. import android.view.ViewGroup.LayoutParams;  
  11. import android.widget.AdapterView;  
  12. import android.widget.AdapterView.OnItemClickListener;  
  13. import android.widget.GridView;  
  14. import android.widget.PopupWindow;  
  15. import android.widget.Toast;  
  16.  
  17. public class Main extends Activity implements OnKeyListener,OnItemClickListener  
  18. {  
  19.     private PopupWindow popup;  
  20.  
  21.     @Override  
  22.     public void onCreate(Bundle savedInstanceState)  
  23.     {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.main);  
  26.         //  创建在弹出窗口中显示的GridView对象  
  27.         GridView gvPopupWindow = (GridView) getLayoutInflater().inflate(R.layout.popup_   
  28.         window, null);  
  29.         //  为GridView提供数据的Adapter对象  
  30.         GridAdapter gridAdapter = new GridAdapter(this);  
  31.         gvPopupWindow.setAdapter(gridAdapter);  
  32.         gvPopupWindow.setOnKeyListener(this);  
  33.         gvPopupWindow.setOnItemClickListener(this);  
  34.         //  创建用于显示菜单的PopupWindow对象。菜单是通过GridView对象显示网格状图像和文字  
  35.         popup = new PopupWindow(gvPopupWindow, LayoutParams.FILL_PARENT,  
  36.                 LayoutParams.WRAP_CONTENT);  
  37.         //  使PopupWindow可以获得焦点,以便可以通过轨迹球或上、下、左、右键来控制菜单项  
  38.         popup.setFocusable(true);  
  39.     }  
  40.     @Override  
  41.     public void onItemClick(AdapterView<?> parent, View view, int position, long id)  
  42.     {  
  43.         //  当单击GridView中的每一项时,先关闭弹出窗口,然后显示一条提示信息  
  44.         popup.dismiss();  
  45.         Toast.makeText(this, Const.GRID_ITEM_TEXT_LIST[position], Toast.LENGTH_LONG).show();  
  46.     }  
  47.     @Override  
  48.     public boolean onKey(View v, int keyCode, KeyEvent event)  
  49.     {  
  50.         switch (keyCode)  
  51.         {  
  52.             case KeyEvent.KEYCODE_BACK:  
  53.                 //  捕捉Back键。如果窗口已经显示,关闭它  
  54.                 if(popup.isShowing())  
  55.                     popup.dismiss();  
  56.                 break;  
  57.         }  
  58.         return false;    
  59.     }  
  60.     @Override  
  61.     public boolean onCreateOptionsMenu(Menu menu)  
  62.     {  
  63.         // 必须创建一项,否则系统不会调用onMenuOpened方法  
  64.         menu.add("menu");            
  65.         return super.onCreateOptionsMenu(menu);  
  66.     }  
  67.     @Override  
  68.     public boolean onMenuOpened(int featureId, Menu menu)  
  69.     {  
  70.         if (popup != null)  
  71.         {  
  72.             if (popup.isShowing())  
  73.             {  
  74.                 //  如果菜单已显示,关闭它  
  75.                 popup.dismiss();  
  76.             }  
  77.             else  
  78.             {  
  79.                 View layout = getLayoutInflater().inflate(R.layout.main, null);  
  80.                 //  弹出菜单  
  81.                 popup.showAtLocation(layout, Gravity.CENTER, 0, 0);  
  82.             }  
  83.         }  
  84.         return false;  
  85.     }  
  86. }  
飞机