菜单Menu:
有三种菜单:(OptionsMenu选择菜单,ContextMenu上下文菜单,SubNenu子菜单),其中子菜单得和其他菜单一起使用。
三种菜单都有动态和静态的加载方法。方法都差不多
一.选择菜单OptionsMenu:
静态加载:
因为是静态加载,所有我们和前面的静态加载一理所当然创建一个xml文件。不够菜单的xml文件一般放在menu文件夹下,例子:
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.z_menu.MainActivity" > <item android:id="@+id/item1" android:orderInCategory="100" android:title="发送通知" app:showAsAction="never"/> <item android:id="@+id/item2" android:orderInCategory="100" android:title="取消发送" app:showAsAction="never"/> <item android:id="@+id/item3" android:orderInCategory="100" android:title="没什么用" app:showAsAction="never"/> </menu>
这个xml文件用了一个menu组件包含了三个item,菜单里面的选项都是item来的
其中app:showAsAction="never"的意思是菜单默认状态不显示
android:orderInCategory="100"表示iltem的优先级,值越大,优先级越低。
继续按照套路,有了布局文件,我们得把布局文件转换成View对象:getMenuInflater().inflate(R.menu.main, menu);
我们需要创建一个选择菜单栏,这需要我们重写Activity的onCreateOptionsMenu(Menu menu)方法,然后在创建菜单栏的时候导入布局文件的View对象。
public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; }
这样我们就可以显示选择菜单栏,接下来我们得实现菜单栏的点击事件,这需要我们重写Activity的onOptionsItemSelected();方法:
public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id){ case R.id.item1 : Toast toast = Toast.makeText(MainActivity.this, "发送通知", Toast.LENGTH_SHORT); toast.show(); break; case R.id.item2 : Toast toast2 = Toast.makeText(MainActivity.this, "取消发送", Toast.LENGTH_SHORT); toast2.show(); break; case R.id.item3 : Toast toast3 = Toast.makeText(MainActivity.this, "没什么用", Toast.LENGTH_SHORT); toast3.show(); break; } return super.onOptionsItemSelected(item); }
我们通过item.getItemId()获取被点击的item从而实现响应item的点击事件。
动态加载:
与静态加载类似,也是需要先在菜单创建的时候添加菜单内容,然后设置点击事件,不同的是静态是直接把xml加载进来,动态需要用menu的add()方法一项一项添加item。
public boolean onCreateOptionsMenu(Menu menu) { /** * menu.add(int groupId, int itemId, int order, String title); * groupId:子菜单的分组id * itemId:菜单里面的item的id * order:优先级 * title:菜单里面的item的名字 */ menu.add(1, 1, 1, "发送通知"); menu.add(1, 2, 1, "取消放送"); menu.add(1, 3, 1, "没什么用"); return true; }
public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id){ case 1 : Toast toast = Toast.makeText(MainActivity.this, "发送通知", Toast.LENGTH_SHORT); toast.show(); break; case 2 : Toast toast2 = Toast.makeText(MainActivity.this, "取消发送", Toast.LENGTH_SHORT); toast2.show(); break; case 3 : Toast toast3 = Toast.makeText(MainActivity.this, "没什么用", Toast.LENGTH_SHORT); toast3.show(); break; } return super.onOptionsItemSelected(item); }
注意这里的id不同的了!,如果想获得分组id,item有getGroundId()方法
二.子菜单SubMenu:
两种加载方法和选择菜单大同小异,创建和响应菜单都是一样的方法
静态加载:
加载方法和选择菜单一样,不过不同的是xml文件不同:
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.z_menu.MainActivity" > <item android:id="@+id/item1" android:orderInCategory="100" android:title="游戏" app:showAsAction="never"> <menu > <item android:id="@+id/item11" android:orderInCategory="100" android:title="LOL" app:showAsAction="never"/> <item android:id="@+id/item12" android:orderInCategory="100" android:title="DNF" app:showAsAction="never"/> <item android:id="@+id/item13" android:orderInCategory="100" android:title="阴阳师" app:showAsAction="never"/> </menu> </item> <item android:id="@+id/item2" android:orderInCategory="100" android:title="食物" app:showAsAction="never"> <menu > <item android:id="@+id/item21" android:orderInCategory="100" android:title="巧克力" app:showAsAction="never"/> <item android:id="@+id/item22" android:orderInCategory="100" android:title="牛奶" app:showAsAction="never"/> <item android:id="@+id/item23" android:orderInCategory="100" android:title="蛋糕" app:showAsAction="never"/> </menu> </item> </menu>
响应方法也是一样,判断item的id(注意是最里面的item的id没,例如item21)
动态加载:
选择菜单的添加是用add()方法直接添加的,我们这里只需要再加多一步添加子菜单就可以了,其他和选择菜单一样。
public boolean onCreateOptionsMenu(Menu menu) { SubMenu a = menu.addSubMenu("游戏"); SubMenu b = menu.addSubMenu("食物"); /** * menu.add(int groupId, int itemId, int order, String title); * groupId:子菜单的分组id * itemId:菜单里面的item的id * order:优先级 * title:菜单里面的item的名字 */ a.add(1, 1, 1, "LOL"); a.add(1, 2, 1, "DNF"); a.add(1, 3, 1, "阴阳师"); b.add(1, 4, 1, "巧克力"); b.add(1, 5, 1, "牛奶"); b.add(1, 6, 1, "蛋糕"); return true; }
响应方法一样,注意id是自定义的1,2,3 ...
三. 上下文菜单ConetxtMenu(这个菜单比较高大上)
通常我们都是长按一个控件然后弹出这个菜单的:
(!这里我们注意的是,这个菜单已经和上面两个不同了。构建方法不同,响应方法也不同。
创建需要重写onCreateContextMenu()方法。响应是onContextItemSelected()方法。
还需要注册上下文菜单registeterForContextMenu(View),里面的参数是长按这个View控件后出现这个注册的上下文菜单。
套路。静态加载:
布局文件和选择菜单的一样。这里我们用一个ListView来注册实现上下文菜单。我们在Activity的布局文件中加一个ListView.加载号item和数据。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = (ListView) findViewById(R.id.lv); //添加数据源 data = new ArrayList<String>(); for(int n = 0; n<5; n++){ data.add(n,"第"+String.valueOf(n+1)+"个item"); } //加载适配器 adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data); lv.setAdapter(adapter); //注册上下文菜单 registerForContextMenu(lv); }
然后我们要构建上下文菜单,重写onCreateContextMenu()方法。
@Override public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) { // TODO Auto-generated method stub getMenuInflater().inflate(R.menu.main, menu); menu.setHeaderTitle("上下文菜单");//设置标题 menu.setHeaderIcon(R.drawable.ic_launcher);//设置图片 super.onCreateContextMenu(menu, v, menuInfo); }
接下来实现响应事件,重写onConetxtItemSelected()方法。
@Override public boolean onContextItemSelected(MenuItem item) { // TODO Auto-generated method stub int id = item.getItemId(); switch (id){ case R.id.item1 : Toast toast = Toast.makeText(MainActivity.this, "LOL", Toast.LENGTH_SHORT); toast.show(); break; case R.id.item2: Toast toast2 = Toast.makeText(MainActivity.this, "DNF", Toast.LENGTH_SHORT); toast2.show(); break; case R.id.item3: Toast toast3 = Toast.makeText(MainActivity.this, "阴阳师", Toast.LENGTH_SHORT); toast3.show(); break; } return super.onContextItemSelected(item); }
动态加载:(和选择菜单一样,onCreateContextMenu(Menu)方法中,用Menu.add()方法,响应也一样,注意id是自定义的id)
我们来顺便讲一下通知:
通知:Notification (需要API 11以上)
通知是什么呢,通知就是我们手机平时在待机时候突然收到的app发来的提示消息,例如你在桌面的时候收到的微信通知。
通知包含什么呢!
图标: setSmallIcon(图片);
手机状态提示: setTicker(String string);
发送的时间: setWhen(Date date);
标题: setContextTitle(String string);
内容: setContentText(String string);
点击后的意图: setContentIntent(pending Intent);
提示: setDefault(int ID);
和我们的提示框一样,创建上面这些属性我们需要一个构建对象,通知构建函数Notification.Builder.
然后我们通过通知管理对象NotificationManager.
提示记得设置权限
private NotificationManager manger = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
public void setNotification(){ Notification.Builder builder = new Notification.Builder(MainActivity.this); builder.setSmallIcon(R.drawable.ic_launcher);//设置图标 builder.setTicker("你有通知!");//设置手机状态提示 builder.setWhen(System.currentTimeMillis());//设置时间,系统当前时间 builder.setContentTitle("通知");//设置标题 builder.setContentText("快点来点我");//设置内容 /** * Notification.DEFAULT_LIGHTS;提示灯 * Notification.DEFAULT_SOUND;提示声 * Notification.DEFAULT_VIBRATE;震动 */ builder.setDefaults(Notification.DEFAULT_ALL);//包含上面所有,记得设置权限。 Intent intent = new Intent(MainActivity.this,MainActivity.class); /** * PendingIntent.getActivity(Context context, int requestCode, Intent intent, int flags) */ PendingIntent pending = PendingIntent.getActivity(MainActivity.this,0, intent, 0); builder.setContentIntent(pending);//设置意图 //Notification notification = builder.build();//4.1以上 Notification notification = builder.getNotification();//以下,当前是API11 manger.notify(1, notification);//发送通知前面是通知的编码,这一取消才知道取消哪一个通知 }
manger.cancel(1);//取消发送
接下来给一个示例来总结今天的内容:
public class MainActivity extends ActionBarActivity { private ListView lv ; private ArrayList<String> data; private ArrayAdapter<String> adapter; private NotificationManager manger; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = (ListView) findViewById(R.id.lv); //添加数据源 data = new ArrayList<String>(); for(int n = 0; n<5; n++){ data.add(n,"第"+String.valueOf(n+1)+"个item"); } //加载适配器 adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data); lv.setAdapter(adapter); //注册上下文菜单 registerForContextMenu(lv); manger = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); } @Override public boolean onCreateOptionsMenu(Menu menu) { //getMenuInflater().inflate(R.menu.main, menu);//静态加载 SubMenu a = menu.addSubMenu("游戏"); SubMenu b = menu.addSubMenu("食物"); /** * menu.add(int groupId, int itemId, int order, String title); * groupId:子菜单的分组id * itemId:菜单里面的item的id * order:优先级 * title:菜单里面的item的名字 */ a.add(1, 1, 1, "LOL"); a.add(1, 2, 1, "DNF"); a.add(1, 3, 1, "阴阳师"); b.add(1, 4, 1, "巧克力"); b.add(1, 5, 1, "牛奶"); b.add(1, 6, 1, "蛋糕"); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id){ case 1 : Toast toast = Toast.makeText(MainActivity.this, "LOL", Toast.LENGTH_SHORT); toast.show(); break; case 2 : Toast toast2 = Toast.makeText(MainActivity.this, "DNF", Toast.LENGTH_SHORT); toast2.show(); break; case 3 : Toast toast3 = Toast.makeText(MainActivity.this, "阴阳师", Toast.LENGTH_SHORT); toast3.show(); break; case 4 : Toast toast4 = Toast.makeText(MainActivity.this, "巧克力", Toast.LENGTH_SHORT); toast4.show(); break; case 5 : Toast toast5 = Toast.makeText(MainActivity.this, "牛奶", Toast.LENGTH_SHORT); toast5.show(); break; case 6 : Toast toast6 = Toast.makeText(MainActivity.this, "蛋糕", Toast.LENGTH_SHORT); toast6.show(); break; } return super.onOptionsItemSelected(item); } @Override public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) { //getMenuInflater().inflate(R.menu.main, menu);//静态加载 menu.setHeaderTitle("上下文菜单");//设置标题 menu.setHeaderIcon(R.drawable.ic_launcher);//设置图片 menu.add(1, 1, 1, "发送通知"); menu.add(1, 2, 1, "取消发送"); menu.add(1, 3, 1, "没上面用"); super.onCreateContextMenu(menu, v, menuInfo); } @Override public boolean onContextItemSelected(MenuItem item) { int id = item.getItemId(); switch (id){ case 1 : setNotification(); break; case 2: manger.cancel(1);//取消发送 Toast toast = Toast.makeText(MainActivity.this, "通知已取消", Toast.LENGTH_SHORT); toast.show(); break; case 3: Toast toast1 = Toast.makeText(MainActivity.this, "都说没用还按", Toast.LENGTH_SHORT); toast1.show(); break; } return super.onContextItemSelected(item); } public void setNotification(){ Notification.Builder builder = new Notification.Builder(MainActivity.this); builder.setSmallIcon(R.drawable.ic_launcher);//设置图标 builder.setTicker("你有通知!");//设置手机状态提示 builder.setWhen(System.currentTimeMillis());//设置时间,系统当前时间 builder.setContentTitle("通知");//设置标题 builder.setContentText("快点来点我");//设置内容 /** * Notification.DEFAULT_LIGHTS;提示灯 * Notification.DEFAULT_SOUND;提示声 * Notification.DEFAULT_VIBRATE;震动 */ builder.setDefaults(Notification.DEFAULT_ALL);//包含上面所有,记得设置权限。 Intent intent = new Intent(MainActivity.this,MainActivity.class); /** * PendingIntent.getActivity(Context context, int requestCode, Intent intent, int flags) */ PendingIntent pending = PendingIntent.getActivity(MainActivity.this,0, intent, 0); builder.setContentIntent(pending);//设置意图 //Notification notification = builder.build();//4.1以上 Notification notification = builder.getNotification();//以下,当前是API11 manger.notify(1, notification);//发送通知前面是通知的编码,这一取消才知道取消哪一个通知 } }
如果有什么错误,或者我理解错误或不当的,恳请大家纠正,谢谢!嘻嘻嘻~~~