Android从入门到精通(21世纪高等学校计算机专业实用规划教材)/好程序员成长丛书

Android从入门到精通(21世纪高等学校计算机专业实用规划教材)/好程序员成长丛书
作者: 编者:千锋教育高教产品研发部
出版社: 清华大学
原售价: 69.00
折扣价: 51.80
折扣购买: Android从入门到精通(21世纪高等学校计算机专业实用规划教材)/好程序员成长丛书
ISBN: 9787302518044

作者简介

内容简介

第3章 常用的UI组件介绍   本章学习目标 掌握本章中讲解的所有UI组件。   我们在实际开发中会经常使用UI组件来组合项目的界面,而常用的UI组件无非就是几种,至于特殊的组件可以通过第2章中的自定义UI组件来绘制。通过对本章的学习,读者应掌握常用UI组件的用法。 3.1 菜 单   Android中的菜单(menu)在桌面应用中十分广泛,几乎所有的桌面应用都会使用到。Android应用中的菜单分为三种:选项菜单(OptionMenu)、上下文菜单(ContextMenu)、弹出式菜单(PopupMenu),本节依次介绍这些内容。 3.1.1 选项菜单   从Android 3.1开始引入了全新的*作栏,扩展了很多功能,例如安置菜单选项、配置应用图标作为导航按钮等。   可显示在*作栏上的菜单称为选项菜单(OptionMenu)。选项菜单提供了一些选项,用户选择后可进行相应的*作。   一般为Android应用添加选项菜单的步骤如下。   (1)重写Activity的onCreateOption**enu(Menu menu)方法,在该方法里调用Menu对象的方法添加菜单项。   (2)如果想要引用程序响应菜单项的单击事件,就要继续重写Activity的onOptionsItemSelected(MenuItem mi)方法。   添加菜单项的方式与UI组件的使用方式一样,可以在代码中使用也可以在XML布局文件中使用。Android同样**在XML中使用菜单,具体为在app\\src\\main\\res文件夹中创建名称为menu的文件夹,创建完成之后在menu文件夹中新建根标签为menu的布局文件,来看具体的示例代码。   【例3-1】 XML文件中的选项菜单options_menu.xml。 1

3 5 7 9      菜单定义完成之后需要在代码中使用才可以看到效果,J**a代码如下:    1 pu**ic class MainActivity extends AppCompatActivity { 2 @Override 3 protected void onCreate(Bundle s**edInstanceState) { 4 super.onCreate(s**edInstanceState); 5 setContentView(R.layout.activity_main); 6 } 7 @Override 8 pu**ic boolean onCreateOption**enu(Menu menu) { 9 getMenuInflater().inflate(R.menu.option_menu, menu); 10 return true; 11 } 12 @Override 13 pu**ic boolean onOptionsItemSelected(MenuItem item) { 14 switch (item.getItemId()) { 15 case R.id.menu_item1: 16 Toast.makeText(MainActivity.this, 17 \\"**个菜单项\\", Toast.LENGTH_LONG).show(); 18 break; 19 case R.id.menu_item2: 20 Toast.makeText(MainActivity.this, 21 \\"第二个菜单项\\", Toast.LENGTH_LONG).show(); 22 break; 23 case R.id.menu_item3: 24 Toast.makeText(MainActivity.this, 25 \\"第三个菜单项\\", Toast.LENGTH_LONG).show(); 26 break; 27 } 28 return true; 29 } 30 }      运行结果如图3.1所示。 图3.1 选项菜单运行结果图   上面代码中第8行和**0行,包含显示菜单和响应菜单单击事件的两个方法。实现简单的选项菜单。   一个简单的选项菜单示例就完成了,下面来分析Menu的组成结构。   Menu接口是一个父接口,该接口下实现了两个子接口。 * SubMenu:代表一个子菜单,可包含1~N个MenuItem(形成菜单项)。 * ContextMenu:代表一个上下文菜单,可包含1~N个MenuItem(形成菜单项)。   Menu接口定义了add()方法用于添加菜单项,addSubMenu()方法用于添加子菜单项。只不过有好几个重载方法可供选择,使用时可根据需求选择。SubMenu继承自Menu,它额外提供了setHeaderIcon、setHeaderTitle、setHeaderView方法,分别用于设置菜单头的图标、标题以及设置菜单头。   这些方法的使用暂不举例讲解,希望大家自行练习,下面介绍ContextMenu。 3.1.2 上下文菜单   3.1.1节讲到,ContextMenu继承自Menu,开发上下文菜单(ContextMenu)与开发选项菜单基本类似,区别在于:开发上下文菜单是重写onCreateContextMenu(ContextMenu menu, View source, ContextMenu.ContextMenuInfo menuInfo)方法,其中source参数代表触发上下文菜单的组件。   开发上下文菜单的步骤如下。   (1)重写Activity的onCreateContextMenu(…)方法。   (2)调用Activity的registerForContextMenu(View view)方法为view注册上下文菜单。   (3)如果想实现单击事件,需要重写onContextItemSelected(MenuItem mi)方法。   与3.1.1节提到的SubMenu子菜单相似,ContextMenu也提供了setHeaderIcon与setHeaderTitle方法为ContextMenu设置图标和标题。   下面实现一个简单的ContextMenu示例,该示例的功能是长按文字出现可供改变文字背景色的上下文菜单,如例3-2所示。   【例3-2】 XML文件中的上下文菜单context_menu.xml。    1 3 5 7 9      在J**a代码MainActivity.j**a中添加上下文菜单:    1 pu**ic class MainActivity extends AppCompatActivity { 2 private TextView textView; 3 @Override 4 protected void onCreate(Bundle s**edInstanceState) { 5 super.onCreate(s**edInstanceState); 6 setContentView(R.layout.activity_main); 7 textView = (TextView) findViewById(R.id.my_text); 8 registerForContextMenu(textView); 9 } 10 @Override 11 pu**ic void onCreateContextMenu(ContextMenu menu, View v, 12 ContextMenu.ContextMenuInfo menuInfo) { 13 getMenuInflater().inflate(R.menu.context_menu, menu); 14 menu.setGroupChecka**e(0, true, true); 15 menu.setHeaderTitle(\\"选择背景颜色\\"); 16 } 17 @Override 18 pu**ic boolean onContextItemSelected(MenuItem item) { 19 switch (item.getItemId()) { 20 case R.id.red: 21 item.setChecked(true); 22 textView.setBackgroundColor(Color.RED); 23 break; 24 case R.id.**ack: 25 item.setChecked(true); 26 textView.setBackgroundColor(Color.**ACK); 27 break; 28 case R.id.**ue: 29 item.setChecked(true); 30 textView.setBackgroundColor(Color.**UE); 31 break; 32 } 33 return true; 34 } 35 @Override 36 protected void onDestroy() { 37 super.onDestroy(); 38 unregisterForContextMenu(textView); 39 } 40 }      运行结果如图3.2所示。 图3.2 上下文菜单运行结果图   上面J**a代码中重写了onCreateContextMenu(…)与onContextItemSelected()方法,分别用于实现加载上下文菜单、实现菜单的单击事件,代码中第8行和第3行,分别是注册和解绑上下文菜单,可能读者会疑惑为什么要在onDestroy()中解绑,这里先不解释,等介绍Activity时一并讲解。   上下文菜单需长按注册的组件才能出现,这一点和选项菜单不同,希望大家认真练习例子中的代码。 3.1.3 弹出式菜单   默认情况下,弹出式菜单(PopupMenu)会在**组件的上方或下方弹出。 PopupMenu可增加多个菜单项,并可为菜单项增加子菜单。   使用PopupMenu的步骤与前两种Menu不同,具体步骤如下。   (1)调用new PopupMenu(Context context, View anchor)创建下拉菜单,anchor代表要激发弹出菜单的组件。   (2)调用MenuInflater的inflate()方法将菜单资源填充到PopupMenu中。   (3)调用PopupMenu的show()方法显示弹出式菜单。   【例3-3】 XML文件中的上下文菜单popup_menu.xml。    1 3 5 7 9 11      界面布局文件中只有一个Button,在Button标签下直接设置单击事件popupMenuClick,代码如下:    1 5