zoukankan      html  css  js  c++  java
  • Android菜单详解*

    Android中的菜单分为三种,即选项菜单(系统菜单),上下文菜单和弹出式菜单。

    选项菜单:

    一个activity只有一个选项菜单,选项菜单的创建方式有低版本创建和高版本创建两种。最常用的是高版本创建,所以这里着重高版本的创建方式的介绍。

    创建步骤:

    1, 在res/menu/文件夹中xml 中定义每个菜单项

    <item
     android:id =" 菜单中每个Item的id"
     android:title="每个Item 文本信息"
     android:orderInCategory :Menu中显示的顺序,数字越小, 越在前面显示, 如果数字一样, 先写那个  那个就在前面位置显示
      android:showAsAcrtion:设置Menu何时和怎样显示在Action Bar中。

       其中属性值:never  :   永远都不显示在Action Bar中
        always :   一直显示在Action Bar中
        ifRoom :   如果有空间 则显示在Action Bar中
    />
    2, 在activity中 显示菜单项
    重写父类的方法:
    onCreateOptionsMenu(Menu menu)
    {
    //加载菜单
    getMenuInflater.inflat(R.menu.main,menu);
    }
    3, 在activity中 每个菜单项实现点击
    重新父类的方法:
    onOptionsItemSelected(MenuItem item)
    {
    switch(item.getItemId())
    {
     case R.id.action_red:
    .......
     break;
    }
    }

     


    上下文菜单:

    ContextMenu 和OptionsMenu的区别
    1,  OptionsMenu 的拥有者是Activity;  ContextMenu 上下文菜单的拥有者是Activity中View
    2,  每个Activity中有且只有一个OptionsMenu,它为整个Activity服务;  每个Activity中可以有多个View, 那个View需要显示上下文菜单 需要为该View注册上下文菜单registerForContextMenu(View  view);
    创建方式
    1, 注册上下文菜单
    2, res/menu/文件中的  创建每个Item项
    3, 重写父类方法:  onCreateContextMenu(ContextMenu menu,View v,ContextMenuInfo menuInfo)
    /**
    * 当长按View时调用

    * ContextMenu menu    需要显示的上下文菜单
    * View v     用户选择的View
    * ContextMenuInfo menuInfo 所选择界面的额外信息
    *      (Spinner,ListView,GridView)
    *      携带这AdapterView 的 posotion信息
    --菜单可见--
    4, 实现菜单项的点击: 重写父类的方法:  onContextItemSelected(MenuItem  item)
    实例:

    [java] view plain copy
     
     print?
    1. public class MainActivity extends Activity {  
    2.     private ListView lv;  
    3.     private List<String> data = new ArrayList<String>();  
    4.     private ArrayAdapter<String> adapter;  
    5.     private int position = 0;  
    6.     @Override  
    7.     protected void onCreate(Bundle savedInstanceState) {  
    8.         super.onCreate(savedInstanceState);  
    9.         setContentView(R.layout.activity_main);  
    10.         lv = (ListView) findViewById(R.id.lv);  
    11.         for (int i = 0; i < 20; i++) {  
    12.             data.add("Item --->" + i);  
    13.         }  
    14.         adapter = new ArrayAdapter<String>(this,  
    15.             android.R.layout.simple_list_item_1, data);  
    16.         lv.setAdapter(adapter);  
    17.         // 1, 注册上下文对象  
    18.         registerForContextMenu(lv);  
    19.     }  
    20.     // 2, 在res/menu/中创建菜单项  
    21.     // 3, 重写父类的方法, 实现显示  
    22.     @Override  
    23.     public void onCreateContextMenu(ContextMenu menu, View v,  
    24.             ContextMenuInfo menuInfo) {  
    25.         super.onCreateContextMenu(menu, v, menuInfo);  
    26.         // 加载菜单页面  
    27.         getMenuInflater().inflate(R.menu.main, menu);  
    28.         // 获取当前选中ListView的Item的下标  
    29.         position = ((AdapterContextMenuInfo) menuInfo).position;  
    30.     }  
    31.     // 4, 重写父类的方法, 实现每个菜单项的点击  
    32.     @Override  
    33.     public boolean onContextItemSelected(MenuItem item) {  
    34.   
    35.         switch (item.getItemId()) {  
    36.         case R.id.action_delete:  
    37.             // 从数据源中移除数据  
    38.             data.remove(position);  
    39.             // 刷新适配器  
    40.             adapter.notifyDataSetChanged();  
    41.         break;  
    42.         }  
    43.         return super.onContextItemSelected(item);  
    44.     }  
    45. }  
    [html] view plain copy
     
     print?
    1. <menu xmlns:android="http://schemas.android.com/apk/res/android" >  
    2.   
    3.     <item  
    4.         android:id="@+id/action_delete"  
    5.         android:orderInCategory="100"  
    6.         android:showAsAction="never"  
    7.         android:title="删除信息"/>  
    8.   
    9. </menu>  

    弹出菜单:

    Popup Menu    弹出式菜单      Api 必须在11以上,  可以为任意View 创建弹出式菜单
      1, 得到PopupMenu的对象
       PopupMenu pMenu = new PopupMenu(this,位置参考的UI控件);
      2, 加载菜单
       getMenuInflater.inflat(R.menu.main,menu);
      3, 为PopupMenu设置监听器
      pMenu.setOnMenuItemClickListener(.....);
      4, 显示菜单
      pMenu.show();
    实例:

    [java] view plain copy
     
     print?
      1. public class MainActivity extends Activity {  
      2.     private TextView tv;  
      3.     @Override  
      4.     protected void onCreate(Bundle savedInstanceState) {  
      5.         super.onCreate(savedInstanceState);  
      6.         setContentView(R.layout.activity_main);  
      7.         tv = (TextView) findViewById(R.id.tv);  
      8.     }  
      9.     // 点击按钮弹出菜单  
      10.     public void change(View v) {  
      11.         // 得到popup对象  
      12.         PopupMenu popupMenu = new PopupMenu(MainActivity.this, v);  
      13.         // 加载菜单  
      14.         getMenuInflater().inflate(R.menu.main, popupMenu.getMenu());  
      15.         // 为 popup设置监听器  
      16.         popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {  
      17.             @Override  
      18.             public boolean onMenuItemClick(MenuItem item) {  
      19.                 // TODO Auto-generated method stub  
      20.                 switch (item.getItemId()) {  
      21.                 case R.id.action_color:  
      22.                     tv.setTextColor(Color.CYAN);  
      23.                     break;  
      24.                 case R.id.action_size:  
      25.                     tv.setTextSize(20);  
      26.                     break;  
      27.                 }  
      28.                 return false;  
      29.             }  
      30.         });  
      31.         // 显示  
      32.         popupMenu.show();  
      33.     }  
      34. }  
  • 相关阅读:
    C#位操作符
    NGEN 本机映像生成器 【转载】
    Azure Services Platform
    补补算术基础:编程中的进制问题
    泛型约束
    去除Live Messenger 中的广告
    对代码性能进行调试和量测
    几个常用的文档转换工具(Office System)
    LINQ to DataSet
    使用 Entity Framework 實現彈性的資料模型 【转载】
  • 原文地址:https://www.cnblogs.com/chenxibobo/p/6088165.html
Copyright © 2011-2022 走看看