资源包:范例练习b7 FLExB7.rar
需求分析:
1.Menu分类:
i.optionsmenu
ii.submenu
iii.contextmenu
2.Menu菜单:
i.Menu.add(int groupid, int itemid, int order, CharSequence title)
ii.onPrepareOptionsMenu动态配置
iii.XMl配置 MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.activity_main, menu);
2.Menu事件处理:
i.onOptionsItemSelected和onContextItemSelected回调函数
ii.监听器setOnMenuItemClickListener
iii.setIntent(Intent intent)方式
View Code
1 package com.example.flexb7; 2 3 import android.os.Bundle; 4 import android.app.Activity; 5 import android.app.AlertDialog; 6 import android.content.DialogInterface; 7 import android.util.Log; 8 import android.view.ContextMenu; 9 import android.view.ContextMenu.ContextMenuInfo; 10 import android.view.Menu; 11 import android.view.MenuInflater; 12 import android.view.MenuItem; 13 import android.view.MenuItem.OnMenuItemClickListener; 14 import android.view.SubMenu; 15 import android.view.View; 16 import android.widget.Button; 17 import android.widget.TextView; 18 import android.widget.Toast; 19 20 public class MainActivity extends Activity { 21 /** 22 menu.add((int groupId, int itemId, int order, charsequence title) .setIcon(drawable ID) 23 24 add()方法的四个参数,依次是: 25 26 1、组别,如果不分组的话就写Menu.NONE或0, 27 28 2、Id,这个很重要,Android根据这个Id来确定不同的菜单 29 30 3、顺序,哪个菜单项在前面由这个参数的大小决定 ,默认0按照代码中顺序排 31 32 4、文本,菜单项的显示文本 33 34 add()方法返回的是MenuItem对象,调用其setIcon()方法,为相应MenuItem设置Icon 35 */ 36 37 private static final String TAG = "TestInfo"; 38 //For Context Menu 39 private Button b1; 40 private Button b2; 41 42 //For onPrepareOptionsMenu 43 private TextView tv1; 44 45 @Override 46 public void onCreate(Bundle savedInstanceState) { 47 super.onCreate(savedInstanceState); 48 setContentView(R.layout.activity_main); 49 50 //For Context Menu 51 b1 = (Button) findViewById(R.id.b1); 52 b2 = (Button) findViewById(R.id.b2); 53 registerForContextMenu(b1); 54 registerForContextMenu(b2); 55 56 //For onPrepareOptionsMenu 57 tv1 = (TextView) findViewById(R.id.tv1); 58 tv1.setText("B"); 59 } 60 61 /****************************************************************** 62 1.Options Menu(presses the device MENU key) 63 最多可以显示6个按钮,不支持复选或单选按钮 64 如果需要有多余6个需要显示,可是用Expanded Menu进行显示 65 ******************************************************************/ 66 /* 67 @Override 68 public boolean onCreateOptionsMenu(Menu menu) { 69 menu.add(Menu.NONE, 0, 0, "About"); 70 menu.add(Menu.NONE, 1, 0, R.string.menu_str); 71 menu.add(0, 2, 0, R.string.menu_exit); 72 return super.onCreateOptionsMenu(menu); 73 } 74 75 //使用onOptionsItemSelected回调方法处理菜单事件 76 public boolean onOptionsItemSelected(MenuItem item){ 77 super.onOptionsItemSelected(item); 78 switch(item.getItemId()){ 79 case 0: 80 openOptionsDialog(); 81 break; 82 case 1: 83 Toast t = Toast.makeText(this, "haha~", Toast.LENGTH_SHORT); 84 t.show(); 85 break; 86 case 2: 87 finish(); 88 break; 89 } 90 return true; 91 } 92 93 private void openOptionsDialog() { 94 new AlertDialog.Builder(this) 95 .setTitle(R.string.app_about) 96 .setMessage(R.string.app_about_msg) 97 .setPositiveButton(R.string.str_ok, 98 new DialogInterface.OnClickListener() { 99 public void onClick( 100 DialogInterface dialoginterface, int i) { 101 } 102 }).show(); 103 } 104 */ 105 106 /****************************************************************** 107 2.SubMenu 108 先弹出一个Options Menu,其中一个menu选项点出SubMenu 109 ******************************************************************/ 110 /* 111 public boolean onCreateOptionsMenu(Menu menu){ 112 menu.add(0,0,0,"Menu1"); 113 menu.add(0,1,0,"Menu2"); 114 SubMenu submenu = menu.addSubMenu(1, 10, 0, "TestSubMenu"); 115 submenu.add(2,11,0,"阿猫"); 116 submenu.add(2,12,0,"阿狗"); 117 return super.onCreateOptionsMenu(menu); 118 } 119 120 public boolean onOptionsItemSelected(MenuItem item){ 121 super.onOptionsItemSelected(item); 122 switch(item.getItemId()){ 123 case 0: 124 openOptionsDialog(); 125 break; 126 case 1: 127 Toast t = Toast.makeText(this, "haha~", Toast.LENGTH_SHORT); 128 t.show(); 129 break; 130 case 11: 131 Toast t2 = Toast.makeText(this, "maomao~", Toast.LENGTH_LONG); 132 t2.show(); 133 break; 134 case 12: 135 finish(); 136 break; 137 } 138 return true; 139 } 140 141 private void openOptionsDialog() { 142 new AlertDialog.Builder(this) 143 .setTitle(R.string.app_about) 144 .setMessage(R.string.app_about_msg) 145 .setPositiveButton(R.string.str_ok, 146 new DialogInterface.OnClickListener() { 147 public void onClick( 148 DialogInterface dialoginterface, int i) { 149 } 150 }).show(); 151 } 152 */ 153 154 /****************************************************************** 155 3.Context Menu 156 长按某个View之后弹出 157 ******************************************************************/ 158 /* 159 @Override 160 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo){ 161 if(v==b1){ 162 menu.setHeaderTitle(R.string.title_b1); 163 menu.add(0,1,0,"MenuB1"); 164 }else if(v==b2){ 165 menu.setHeaderTitle(R.string.title_b2); 166 menu.add(1,2,0,"MenuB2"); 167 } 168 super.onCreateContextMenu(menu, v, menuInfo); 169 } 170 */ 171 172 /****************************************************************** 173 4.onPrepareOptionsMenu 方式 动态设置Menu 174 onCreateOptionMenu只在第一次载入activity时调用 175 onPrepareOptionsMenu每次操作都会被调用 176 根据不同的界面某控件值显示不同的菜单 177 如:当某TextView值为A,弹出菜单A,值为B,弹出菜单B 178 ******************************************************************/ 179 /* 180 public boolean onCreateOptionMenu(Menu menu){ 181 tv1 = (TextView) findViewById(R.id.tv1); 182 return super.onCreateOptionsMenu(menu); 183 } 184 185 @Override 186 public boolean onPrepareOptionsMenu(Menu menu){ 187 String tv1str = tv1.getText().toString(); 188 if("A".equalsIgnoreCase(tv1str)){ 189 System.out.println("------------>A"); 190 menu.clear(); 191 MenuItem item = menu.add(0, 1, 0, "change into B");//这种写法只是为了把item拎出来下一步setIcon 192 //item.setIcon(android.R.drawable.alert_dark_frame);//android默认图标 193 //menu.add(0, 1, 0, "change into B").setIcon(android.R.drawable.alert_dark_frame); 194 }else if("B".equalsIgnoreCase(tv1str)){ 195 System.out.println("------------>B"); 196 menu.clear(); 197 MenuItem item = menu.add(0, 2, 0, "change into A"); 198 //item.setIcon(android.R.drawable.alert_light_frame); 199 //menu.add(0, 2, 0, "change into A").setIcon(android.R.drawable.alert_light_frame); 200 }else{ 201 System.out.println("------------>C"); 202 menu.clear(); 203 } 204 menu.add(0, 3, 0, "TextView is " + tv1str);//现在共有两个菜单子项 205 return super.onPrepareOptionsMenu(menu); 206 207 } 208 209 @Override 210 public boolean onOptionsItemSelected(MenuItem item){//重写还是声明下@Override保险 少写个s查了好半天错 211 super.onOptionsItemSelected(item); 212 System.out.println(item + "********item********"+ item.getItemId()); 213 switch(item.getItemId()){ 214 case 1: 215 tv1.setText("B"); 216 break; 217 case 2: 218 tv1.setText("A"); 219 break; 220 case 3: 221 tv1.setText("More"); 222 default: 223 break; 224 } 225 return false; 226 } 227 */ 228 /****************************************************************** 229 5.xml配置 方式 创建Menu 230 ******************************************************************/ 231 @Override 232 public boolean onCreateOptionsMenu(Menu menu){ 233 MenuInflater inflater = getMenuInflater(); 234 inflater.inflate(R.menu.activity_main, menu); 235 /* 236 * 使用监听器的方式处理菜单事件 237 * 另外有: 238 * 2.onOptionsItemSelected和onContextItemSelected回调方式处理事件 239 * 3.setIntent(Intent intent)方式 240 */ 241 for(int i=0;i<menu.size();i++){ 242 menu.getItem(i).setOnMenuItemClickListener(new OnMenuItemClickListener() { 243 @Override 244 public boolean onMenuItemClick(MenuItem item) { 245 Log.d(TAG,"ItemId()===>>>" + item.getItemId()); 246 switch(item.getItemId()){ 247 case R.id.menu_a: 248 //第一个参数Context要指定到MainActivity,默认this会变成OnMenuItemClickListener 249 Toast.makeText(MainActivity.this, "menu_a", Toast.LENGTH_SHORT).show(); 250 break; 251 case R.id.menu_b: 252 Toast.makeText(MainActivity.this, "menu_b", Toast.LENGTH_LONG).show(); 253 tv1.setText("change"); 254 break; 255 case R.id.menu_c: 256 Toast.makeText(MainActivity.this, "menu_c", Toast.LENGTH_SHORT).show(); 257 break; 258 default: 259 break; 260 } 261 return true; 262 } 263 }); 264 } 265 super.onCreateOptionsMenu(menu); 266 return true; 267 268 } 269 } 270 /** 271 //直接return false; 那就是父类处理,不处理子类方法,不出现自定义的菜单 272 //调用父类的方法再return false也是父类处理,不处理子类方法,不出现自定义的菜单 273 //直接return true 仅处理子类方法,出现自定义的菜单 274 //调用父类的方法再return true 处理父子类方法,但父类方法应该没做具体实现,出现自定义的菜单 275 //return super.onCreateOptionsMenu(menu);同,处理父子类方法,出现自定义的菜单 276 //当处理多个监听时具体情况还未遇到 277 */ 278 279 //http://www.cnblogs.com/giuz/archive/2010/10/19/1855235.html 280 //http://blog.csdn.net/rhljiayou/article/details/7068567