资源包:范例练习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

 

posted on 2012-11-16 11:28  hanxun  阅读(254)  评论(0编辑  收藏  举报