创建弹出菜单

来源:互联网 发布:matlab生成随机数矩阵 编辑:程序博客网 时间:2024/06/09 18:37
1.ActionBar中的菜单:http://www.tuicool.com/articles/VrUBRf

2.ContextMenu(上下文菜单)

  • 首先在res/menu/中创建一个XML文件,以定义菜单,我们将其命名为options
    <?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools">    <item        android:id="@+id/add_item"        android:title="Add Item"        android:icon="@drawable/ic_launcher"        android:showAsAction="ifRoom"        tools:ignore="AppCompatResource"        />    <item        android:id="@+id/remove_item"        android:title="remove Item"        android:icon="@drawable/ic_launcher"        android:showAsAction="always"        tools:ignore="AppCompatResource"        />    <item        android:id="@+id/menu_edit"        android:title="edit Item"        android:icon="@drawable/ic_launcher"        android:showAsAction="never"        tools:ignore="AppCompatResource"        /></menu>

     

  • 然后再Activity中用onCreatContextMenu()和onContextItemSelected()方法填充菜单,处理用户的选择
  •  1 @Override 2     public boolean onContextItemSelected(MenuItem item) { 3         switch(item.getItemId()){ 4             case R.id.add_item: 5                 //执行添加动作 6                 break; 7             case R.id.remove_item: 8                 //执行删除动作 9                 break;10             case R.id.menu_edit:11                 break;12             default:13                 return super.onContextItemSelected(item);14         }15         return true;16     }17 18 19     @Override20     public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {21         menu.setHeaderTitle("Choose an option");22         getMenuInflater().inflate(R.menu.options,menu);23         super.onCreateContextMenu(menu, v, menuInfo);24 25     }

     

  • 默认是用户长按item时会触发菜单项,进而弹出选项框
  • 使用时要使用registerForContextMenu(View view)来注册菜单,即将ContextMenu绑定到某个view中
  • 示例:
     1 package com.example.qjm3662.service_learn; 2  3 import android.content.ComponentName; 4 import android.content.Intent; 5 import android.content.ServiceConnection; 6 import android.os.IBinder; 7 import android.support.v7.app.AppCompatActivity; 8 import android.os.Bundle; 9 import android.view.ContextMenu;10 import android.view.Menu;11 import android.view.MenuItem;12 import android.view.View;13 import android.view.Window;14 import android.widget.ArrayAdapter;15 import android.widget.ListView;16 import android.widget.TimePicker;17 import android.widget.Toast;18 19 public class MainActivity extends AppCompatActivity {20 21     private static final String[] ITEMS = {"Lost","Time","Will","Never","Be","Find","again!"};22     @Override23     protected void onCreate(Bundle savedInstanceState) {24         super.onCreate(savedInstanceState);25         ListView list = new ListView(this);26         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,ITEMS);27         list.setAdapter(adapter);28         registerForContextMenu(list);29         setContentView(list);30     }31 32 33 34 35     @Override36     public boolean onContextItemSelected(MenuItem item) {37         switch(item.getItemId()){38             case R.id.add_item:39                 //执行添加动作40                 break;41             case R.id.remove_item:42                 //执行删除动作43                 break;44             case R.id.menu_edit:45                 break;46             default:47                 return super.onContextItemSelected(item);48         }49         return true;50     }51 52 53     @Override54     public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {55         menu.setHeaderTitle("Choose an option");56         getMenuInflater().inflate(R.menu.options,menu);57         super.onCreateContextMenu(menu, v, menuInfo);58 59     }60 61 62    63 }

3.ActionMode

  激活ActionMode后会在系统的ActionBar上出现一个自定义的菜单,覆盖在原ActionBar上,并出现一个额外的可以退出ActionMode的选项。还允许同时选择多个条目来执行同一个动作。

 1 package com.example.qjm3662.service_learn; 2  3 import android.support.v7.app.AppCompatActivity; 4 import android.os.Bundle; 5 import android.view.ActionMode; 6 import android.view.Menu; 7 import android.view.MenuItem; 8 import android.view.View; 9 import android.widget.AbsListView;10 import android.widget.AdapterView;11 import android.widget.ArrayAdapter;12 import android.widget.ListView;13 14 public class MainActivity extends AppCompatActivity implements AbsListView.MultiChoiceModeListener{15 16     ListView list;17     private static final String[] ITEMS = {"Lost","Time","Will","Never","Be","Find","again!"};18     @Override19     protected void onCreate(Bundle savedInstanceState) {20         super.onCreate(savedInstanceState);21         list = new ListView(this);22         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,ITEMS);23         list.setAdapter(adapter);24         list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);25         list.setMultiChoiceModeListener(this);26         setContentView(list);27     }28 29 30     @Override31     //当子控件的选择状态发生改变时调用该方法32     public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {33         //获得list中被选中的item数目34         int count = list.getCheckedItemCount();35         mode.setTitle(String.format("%d Selected", count));36     }37 38     @Override39     public boolean onCreateActionMode(ActionMode mode, Menu menu) {40         getMenuInflater().inflate(R.menu.options,menu);41         return true;42     }43 44     @Override45     public boolean onPrepareActionMode(ActionMode mode, Menu menu) {46         //如果ActionMode一直是无效,可以在这里做些工作来更新菜单47         return true;48     }49 50     @Override51     public boolean onActionItemClicked(ActionMode mode, MenuItem item) {52         //通过条目的Id得到用户的选择动作53         switch (item.getItemId()){54             case R.id.add_item:55                 //执行添加动作56                 break;57             case R.id.remove_item:58                 //执行删除动作59                 break;60             case R.id.menu_edit:61                 break;62             default:63                 return false;64         }65         return true;66     }67 68     @Override69     public void onDestroyActionMode(ActionMode mode) {70         //退出ActionMode时会调用该方法71     }72 }

0 0