一、菜单
(1)选择菜单(OptionsMenu)
第一种方法:
1、在res目录下建立一个名称是menu的文件夹;
2、在menu下面建立一个XML文件(默认就是menu的类型)
3、在建立的XML文件中添加菜单的选项
XML中有很多的属性:
<1>android:orderInCategory 表示的意思是:确定当前的item在整个item中所在的位置(数字越小越靠前)
<2>android:title 确定选项的内容
<3>android:id 设置选项ID
<4>android:icon 设置选项的图标
<5>android:showAsAction 设置图标的显示方式
1. <?xml version="1.0" encoding="utf-8"?>
2. <menu xmlns:android="http://schemas.android.com/apk/res/android" >
3.
4. <item
5. android:id="@+id/select_01"
6. android:orderInCategory="1"
7. android:title="马超"/>
8. <item
9. android:id="@+id/select_02"
10. android:orderInCategory="2"
11. android:title="马云禄"/>
12. <item
13. android:id="@+id/select_03"
14. android:orderInCategory="3"
15. android:title="马谡"/>
16.
17. </menu>
4、在Activity中重写onCreateOptionsMenu方法
1. @Override
2. public boolean onCreateOptionsMenu(Menu menu) {
3.
4. }
5、通过getMenuInflater()的布局加载器来加载文件
getMenuInflater().inflate(R.menu.main,menu);
第二个参数表示的意思是将前面的menu布局加载到后面的menu对象中。
第二种方法
1、 在Activity默认重写的onCreateOptionsMenu方法中通过menu对象的add方法来添加item的值
menu.add(" "); 添加选项的内容
1. menu.add("黄盖");
2. menu.add("黄忠");
3. menu.add("黄月英");
menu.add(groupId,ItemId,orderInCategory,title);
第一个参数:表示组的ID
第二个参数:表示自己的ID
第三个参数:Item的排列顺序
第四个参数:当前Item的内容
1. menu.add(1, 1, 1, "曹洪");
2. menu.add(1, 2, 2, "曹丕");
3. menu.add(2, 1, 3, "夏侯渊");
4. menu.add(2, 2, 4, "夏侯惇");
2、在Item中添加子菜单
menu.addSubMenu(" "); 添加菜单内容
1. menu.addSubMenu("孙坚");
2. menu.addSubMenu("孙权");
3. menu.addSubMenu("孙策");
menu.addSubMenu(groupId,ItemId,orderInCategory,title);
第一个参数:表示组的ID
第二个参数:表示自己的ID
第三个参数:Item的排列顺序
第四个参数:当前Item的内容
注意:添加子菜单的需要在addSubMenu方法的返回值中进行添加
1. SubMenu subMenu = menu.addSubMenu("魏国");
2. subMenu.add("曹操");
3. subMenu.add("典韦");
4. subMenu.add("许褚");
5. SubMenu subMenu2 = menu.addSubMenu("蜀国");
6. subMenu2.add("周仓");
7. subMenu2.add("关平");
8. subMenu2.add("马良");
9. SubMenu subMenu3 = menu.addSubMenu("吴国");
10. subMenu3.add("大乔");
11. subMenu3.add("小乔");
12. subMenu3.add("孙尚香");
菜单事件的监听
第一种方法:
直接重写onOptionsItemSelected(MenuItem item)方法,在这个参数里可以通过item.getItemId()来获取当前点击Item的id。
1. @Override
2. public boolean onOptionsItemSelected(MenuItem item) {
3. switch (item.getItemId()) {
4. case R.id.select_01:
5. Toast.makeText(MainActivity.this, "你选择了马超", Toast.LENGTH_SHORT)
6. .show();
7. break;
8. case R.id.select_02:
9. Toast.makeText(MainActivity.this, "你选择了马云禄", Toast.LENGTH_SHORT)
10. .show();
11. break;
12. case R.id.select_03:
13. Toast.makeText(MainActivity.this, "你选择了马谡", Toast.LENGTH_SHORT)
14. .show();
15. break;
16.
17. default:
18. break;
19. }
20. return super.onOptionsItemSelected(item);
21. }
第二种方法:
menu.add() 返回一个menuitem的对象
menuItem.setOnMenuItemClickListenter(MenuItem item) 可以进行选项菜单的判定
1. MenuItem menuItem = menu.add(1, 1, 1, "黄盖");
2. MenuItem menuItem2 = menu.add(1, 2, 2, "黄忠");
3. MenuItem menuItem3 = menu.add(1, 3, 3, "黄月英");
4. menuItem.setOnMenuItemClickListener(new MyOnMenuItemClickListener());
5. menuItem2.setOnMenuItemClickListener(new MyOnMenuItemClickListener());
6. menuItem3.setOnMenuItemClickListener(new MyOnMenuItemClickListener());
1. private class MyOnMenuItemClickListener implements OnMenuItemClickListener {
2.
3. @Override
4. public boolean onMenuItemClick(MenuItem item) {
5. switch (item.getItemId()) {
6. case 1:
7. Toast.makeText(MainActivity.this, "你选择了黄盖", Toast.LENGTH_SHORT)
8. .show();
9. break;
10. case 2:
11. Toast.makeText(MainActivity.this, "你选择了黄忠", Toast.LENGTH_SHORT)
12. .show();
13. break;
14. case 3:
15. Toast.makeText(MainActivity.this, "你选择了黄月英", Toast.LENGTH_SHORT)
16. .show();
17. break;
18.
19. default:
20. break;
21. }
22. return false;
23. }
24.
25. }
选项菜单的注意事项:
选项菜单以来的对象是Activity,不能依赖于View。
(2)上下文菜单(ContextMenu)
注意:上下文菜单依赖的对象是View,也就是说可以触发某个控件来显示一个菜单选项。
第一种方法:
1、和选项菜单一样,在menu文件夹下建立一个Android XML file来进行配置;
1. <menu xmlns:android="http://schemas.android.com/apk/res/android"
2. xmlns:tools="http://schemas.android.com/tools"
3. tools:context="com.hxl.android_day01_test.ContextMenuActivity" >
4.
5. <item
6. android:id="@+id/wei"
7. android:orderInCategory="1"
8. android:showAsAction="never"
9. android:title="魏国"/>
10. <item
11. android:id="@+id/shu"
12. android:orderInCategory="2"
13. android:showAsAction="never"
14. android:title="蜀国"/>
15. <item
16. android:id="@+id/wu"
17. android:orderInCategory="3"
18. android:showAsAction="never"
19. android:title="吴国"/>
20.
21. </menu>
2、重写Activity中的onCreateContextMenu()方法
1. @Override
2. public void onCreateContextMenu(ContextMenu menu, View v,
3. ContextMenuInfo menuInfo) {
4. getMenuInflater().inflate(R.menu.context_menu, menu);
5. super.onCreateContextMenu(menu, v, menuInfo);
6. }
3、注册在控件上弹出一个上下文菜单registerForContextMenu(View view);(后面的参数表示绑定的View)
1. Button button=(Button) findViewById(R.id.btn);
2. registerForContextMenu(button);
上下文菜单的事件处理:
第一种方法
在Activity中重写onContextItemSelected(MenuItem item)方法,可以通过item.getItemId()来获取点击的Item的id。
1. @Override
2. public boolean onContextItemSelected(MenuItem item) {
3. switch (item.getItemId()) {
4. case R.id.wei:
5. Toast.makeText(ContextMenuActivity.this, "你选择了魏国", Toast.LENGTH_SHORT).show();
6. break;
7. case R.id.shu:
8. Toast.makeText(ContextMenuActivity.this, "你选择了蜀国", Toast.LENGTH_SHORT).show();
9. break;
10. case R.id.wu:
11. Toast.makeText(ContextMenuActivity.this, "你选择了吴国", Toast.LENGTH_SHORT).show();
12. break;
13.
14. default:
15. break;
16. }
17. return super.onContextItemSelected(item);
18. }
第二种方法
menu.add() 返回的是一个menuItem对象
menuItem.setOnMenuItemClickListener(MenuItem item) 进行选项菜单的判定
1. MenuItem menuItem = menu.add(1, 1, 1, "周瑜");
2. MenuItem menuItem2 = menu.add(1, 2, 3, "甘宁");
3. MenuItem menuItem3 = menu.add(1, 3, 3, "凌统");
4. menuItem.setOnMenuItemClickListener(new MyOnMenuItemClickListener());
5. menuItem2.setOnMenuItemClickListener(new MyOnMenuItemClickListener());
6. menuItem3.setOnMenuItemClickListener(new MyOnMenuItemClickListener());
1. private class MyOnMenuItemClickListener implements OnMenuItemClickListener{
2.
3. @Override
4. public boolean onMenuItemClick(MenuItem item) {
5. switch (item.getItemId()) {
6. case 1:
7. Toast.makeText(ContextMenuActivity.this, "你选择了周瑜", Toast.LENGTH_SHORT).show();
8. break;
9. case 2:
10. Toast.makeText(ContextMenuActivity.this, "你选择了甘宁", Toast.LENGTH_SHORT).show();
11. break;
12. case 3:
13. Toast.makeText(ContextMenuActivity.this, "你选择了凌统", Toast.LENGTH_SHORT).show();
14. break;
15.
16. default:
17. break;
18. }
19. return false;
20. }
(3)PopupMenu的使用
1、PopupMenu popupMenu=new PopupMenu(PopupMenuActivity.this, v);初始化PopupMenu对象,第二个参数的意思是:将PopupMenu绑定给此控件
2、popupMenu.getMenuInflater().inflate(R.menu.popup_menu, popupMenu.getMenu());绑定布局对象
3、popupMenu.setOnMenuItemClickListener(new MyOnMenuItemClickListener());设置点击事件
4、popupMenu.show();显示菜单
5、popupMenu.setOnDismissListener(new MyOnDismissListener());设置消失时触发的事件
6、popupMenu.dismiss();菜单消失
ContextMenu和PopupMenu的区别是什么?
ContextMenu中只能绑定一个View来进行显示;PopupMenu能够同时绑定多个View来进行显示。
(4)PopupWindow的使用(在某一控件下可以弹出一个选项框的内容)重点
//第一步:初始化PopupWindow对象
PopupWindow popupWindow=new PopupWindow(PopupWindowActivity.this);
//第二步:通过PopupWindow对象来对PopupWindow对象添加相应的设置
popupWindow.setHeight(LayoutParams.WRAP_CONTENT);
popupWindow.setWidth(LayoutParams.WRAP_CONTENT);
//下面这句代码常常用来解决一个问题:点击弹出框以外的区域如果弹出框不消失的话,添加这个属性理论上就消失了(一般情况也不设置)
popupWindow.setBackgroundDrawable(new ColorDrawable(0x00000000));
//设置弹出框可以获取焦点
popupWindow.setFocusable(true);
//表示的是在弹出框以外的区域点击了之后,弹出框消失(true)
popupWindow.setOutsideTouchable(true);
//表示的是是否可以触摸(一般不设置)
popupWindow.setTouchable(true);
//第三步:通过布局加载器对象将XML文件转换成View对象
LayoutInflater inflater=getLayoutInflater();
View view =inflater.inflate(R.layout.popupwindow_list, null);
//第四步:将View添加到PopupWindow中
popupWindow.setContentView(view);
//第五步:确定PopupWindow显示的位置
popupWindow.showAsDropDown(v);
//让PopupWindow消失的方法
popupWindow.dismiss();
(5)对话框的写法
1、初始化对话框的Builder
AlertDialog.Builder builder=new Builder(DialogActivity.this);
2、通过Builder来设置相应的信息
builder.setTitle("你要选择哪个国家?");
builder.setIcon(R.drawable.ic_launcher);
builder.setMessage("确定你要选择的国家");
3、.show();
六种对话框:
第一种:
1. /**
2. * 用于提示信息,只是满足数据显示
3. */
4.
5. public void firstDialog(){
6. //第一步:通过AlertDailog中的Builder完成Builder的初始化,对话框的使用其实是用Builder创建的
7. //这里的上下文对象只能是当前Dailog所归属的页面的上下文,不能使getApplicationContext()
8. AlertDialog.Builder builder=new Builder(DialogActivity.this);
9. //第二步:可以通过Builder来设置显示的信息
10. builder.setTitle("你要选择哪个国家?");
11. builder.setIcon(R.drawable.ic_launcher);
12. builder.setMessage("确定你要选择的国家");
13. builder.setNegativeButton("魏", new DialogInterface.OnClickListener() {
14.
15. @Override
16. public void onClick(DialogInterface dialog, int which) {
17. Log.i("****", "你选择了魏国");
18. }
19. });
20. builder.setNeutralButton("蜀", new DialogInterface.OnClickListener() {
21.
22. @Override
23. public void onClick(DialogInterface dialog, int which) {
24. Log.i("****", "你选择了蜀国");
25. }
26. });
27. builder.setPositiveButton("吴", new DialogInterface.OnClickListener() {
28.
29. @Override
30. public void onClick(DialogInterface dialog, int which) {
31. Log.i("****", "你选择了吴国");
32. }
33. });
34. builder.show();
35. }
第二种:
1. /**
2. * 带有那个输入框的对话框
3. */
4. public void secondDialog() {
5. AlertDialog.Builder builder=new Builder(DialogActivity.this);
6. builder.setTitle("请输入");
7. final EditText editText=new EditText(DialogActivity.this);
8. builder.setView(editText);
9. builder.setNegativeButton("取消",null);
10. builder.setPositiveButton("确定",new DialogInterface.OnClickListener() {
11. @Override
12. public void onClick(DialogInterface dialog, int which) {
13. Log.e("-------------","你提交了信息 "+editText.getText().toString());
14. }
15. });
16. builder.show();
17. }
第三种:
1. /**
2. * 带有多选框的对话框
3. */
4. public void thirdDialog() {
5. AlertDialog.Builder builder=new Builder(DialogActivity.this);
6. builder.setTitle("你喜欢的城市");
7. builder.setMultiChoiceItems(new String[]{"成都","广州","上海","北京"},new boolean[]{false,false,false,true},new OnMultiChoiceClickListener() {
8. /**
9. * which:Item的位置
10. * isChecked:选中的状态是什么? 取消/选中
11. */
12. @Override
13. public void onClick(DialogInterface dialog, int which, boolean isChecked) {
14. Log.e("-------你选择的位置是:"+which+"当前的状态是:",isChecked+"");
15. }
16. });
17. builder.setNegativeButton("取消",null);
18. builder.setPositiveButton("确定",new DialogInterface.OnClickListener() {
19. @Override
20. public void onClick(DialogInterface dialog, int which) {
21. Log.e("------------------","数据已经提交....");
22. }
23. });
24. builder.show();
25. }
第四种:
1. /**
2. * 具有单选框的对话框
3. */
4. public void fouthDialog() {
5. AlertDialog.Builder builder=new Builder(DialogActivity.this);
6. builder.setTitle("性别选择");
7. builder.setSingleChoiceItems(new String[]{"男","女","other"}, 0,new DialogInterface.OnClickListener() {
8. @Override
9. public void onClick(DialogInterface dialog, int which) {
10. Log.e("-------当前选中的位置是:-------",which+"");
11. }
12. });
13. builder.setNegativeButton("取消",null);
14. builder.setPositiveButton("提交",new DialogInterface.OnClickListener() {
15. @Override
16. public void onClick(DialogInterface dialog, int which) {
17. Log.e("-----------","数据已经提交慢慢刷....");
18. }
19. });
20. builder.show();
21. }
第五种:
1. /**
2. * 含有list形式的对话框
3. */
4. public void fifthDialog(){
5. AlertDialog.Builder builder=new Builder(DialogActivity.this);
6. builder.setTitle("多Item形式的对话框");
7. builder.setItems(new String []{"魏","蜀","吴"},new DialogInterface.OnClickListener() {
8.
9. @Override
10. public void onClick(DialogInterface dialog, int which) {
11. Log.i("------", "当前的选择位置是:"+which);
12. dialog.dismiss();
13. }
14. });
15. builder.show();
16. }
第六种:
1. public class MyDialog extends Dialog{
2. String title;
3. String content;
4. TextView mTextViewTitle;
5. TextView mTextViewContent;
6. Button cancer;
7. Button submit;
8.
9. public MyDialog(Context context,String title,String content) {
10. super(context);
11. this.title=title;
12. this.content=content;
13. init(context);
14. }
15. /**
16. * 初始化Dialog
17. */
18. private void init(Context context) {
19. //第一步:获取布局加载器
20. LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
21. //第二步:将layout转换成View
22. View view =inflater.inflate(R.layout.dialog_layout, null);
23. setContentView(view);
24. //设置自定义Dialog的窗口的宽高
25. getWindow().setLayout(600, 600);
26. //第三步:找到控件
27. mTextViewTitle=(TextView) view.findViewById(R.id.textViewTitle);
28. mTextViewContent=(TextView) view.findViewById(R.id.textView);
29. cancer=(Button) view.findViewById(R.id.btncancer);
30. submit=(Button) view.findViewById(R.id.btnSure);
31. mTextViewContent.setText(content);
32. mTextViewTitle.setText(title);
33. submit.setOnClickListener(new Listener());
34. cancer.setOnClickListener(new Listener());
35. }
36. /**
37. * 定义一个回调函数来完成那个点击消息的回调
38. */
39. interface CallBack{
40. public void click(int id);
41. }
42. CallBack callBack=null;
43. public void setOnCallBackListener(CallBack callBack){
44. this.callBack=callBack;
45. }
46. /**
47. * 点击事件
48. */
49. private class Listener implements android.view.View.OnClickListener{
50.
51. @Override
52. public void onClick(View v) {
53. callBack.click(v.getId());
54. }
55.
56. }
57.
58. }
1. case R.id.btn_06_dialog:
2. MyDialog dialog=new MyDialog(DialogActivity.this, "请做出选择", "你确定要这样吗?");
3. dialog.setOnCallBackListener(new CallBack() {
4.
5. @Override
6. public void click(int id) {
7. switch (id) {
8. case R.id.btnSure:
9. Log.i("--------", "您选择了提交按钮");
10. break;
11. case R.id.btncancer:
12. Log.i("--------", "您选择了取消按钮");
13. break;
14. default:
15. break;
16. }
17. }
18. });
19. dialog.show();
20. break;