常用的UI组件介绍 第3章 本章学习目标 .掌握本章中讲解的Android系统中常用的UI组件。 .掌握对话框的具体使用方法。 .理解ProgresBar及其子类的概念。 实际开发中会经常使用UI组件来组合项目的界面,特殊的组件可以通过第2章中自 定义的UI组件来绘制。通过对本章节的学习,掌握常用UI组件的用法。 3.菜单 1 Android中的菜单(menu)在桌面应用方面十分广泛,几乎所有的桌面应用都会使用到 菜单。但在具体应用中却没有那么多菜单,即便如此,它也是很重要的。Android应用中的 菜单分为3种:选项菜单(OptionMenu)、上下文菜单(ContextMenu)、弹出式菜单 (PopupMenu)。本节依次介绍这些内容。 3.1 选项菜单 1. 从And1开始,d引入了全新的操作栏,扩展了很多功能,例如安置菜单选 项、配置应用图标作为导航按钮等。 可显示在操作栏上的菜单称为选项菜单。选项菜单提供了一些选项,用户选择后可进 行相应的操作。 一般为Android应用添加选项菜单的步骤如下: roid3.Androi (1)重写Activity的onCreateOptionsMenu(Menumenu)方法,在该方法里调用Menu 对象的方法添加菜单项。 (2)如果想要引用程序响应菜单项的点击事件,就要继续重写Activity的 onOptionsItemSelected(MenuItemmi)方法。 添加菜单项的方式与UI组件的方式一样,可以在代码中使用,也可以在XML布局文 件中使用。Android同样推荐在XML中使用菜单,具体为在app\src\main\res文件夹中 创建名称为menu的文件夹,创建完成之后在menu文件夹中新建根标签为menu的布局文 件,具体如例3. 1所示。 Android 移动开发与项目实战(微课视频版) 7 2 例3.1 XML文件中的选项菜单options_menu.xml 1 3 5 7 9 菜单定义完成之后需要在代码中使用才可以看到效果,Java代码如下所示。 1 public class MainActivity extends AppCompatActivity { 2 @Override 3 protected void onCreate(Bundle savedInstanceState) { 4 super.onCreate(savedInstanceState); 5 setContentView(R.layout.activity_main); 6 } 7 @Override 8 public boolean onCreateOptionsMenu(Menu menu) { 9 getMenuInflater().inflate(R.menu.option_menu, menu); 10 return true; 11 } 12 @Override 13 public 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 } 上述程序中第8行和第13行代码是显示菜单和响应菜单点击事件的两个方法。这样 7 3 第3章 常用的UI组件介绍 图3.1 选项菜单运行结果 就实现了简单的选项菜单,程序运行结果如图3.1所示。 一个简单的选项菜单示例就完成了。下面来分析 Menu的组成结构。 Menu接口是一个父接口,该接口下实现了两个子接口。 . SubMenu:代表一个子菜单,可包含1~N 个 MenuItem(形成菜单项)。 . ContextMenu:代表一个上下文菜单,可包含1~ N 个MenuItem。 Menu 接口定义了add()方法用于添加菜单项, addSubMenu()方法用于添加子菜单项。有好几个重载方 法可供选择,使用时可根据需求选择。SubMenu继承自 Menu,它额外提供了setHeaderIcon()、setHeaderTitle() 和setHeaderView()方法,分别用于设置菜单头的图标、标题以及菜单头。 这些方法的使用暂不举例讲解,希望读者自行练习。 3.1.2 上下文菜单 3.1.1节讲到,ContextMenu继承自Menu,开发上下文菜单与开发选项菜单基本类似, 区别在于:开发上下文菜单是重写onCreateContextMenu(ContextMenu menu,View source,ContextMenu.ContextMenuInfomenuInfo)方法,其中source参数代表触发上下文 菜单的组件。 开发上下文菜单的步骤如下: (1)重写Activity的onCreateContextMenu()方法。 (2)调用Activity的registerForContextMenu(Viewview)方法为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 Android 移动开发与项目实战(微课视频版) 7 4 在Java代码MainActivity.java中添加上下文菜单。 1 package com.example.chapater3_2; 2 import androidx.appcompat.app.AppCompatActivity; 3 import android.graphics.Color; 4 import android.os.Bundle; 5 import android.view.ContextMenu; 6 import android.view.MenuItem; 7 import android.view.View; 8 import android.widget.TextView; 9 10 public class MainActivity extends AppCompatActivity { 11 private TextView textView; 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.activity_main); 16 textView = (TextView) findViewById(R.id.my_text); 17 registerForContextMenu(textView); 18 } 19 20 @Override 21 public void onCreateContextMenu(ContextMenu menu, View v, 22 ContextMenu.ContextMenuInfo menuInfo) { 23 getMenuInflater().inflate(R.menu.context_menu, menu); 24 menu.setGroupCheckable(0, true, true); 25 menu.setHeaderTitle("选择背景颜色"); 26 } 27 28 @Override 29 public boolean onContextItemSelected(MenuItem item) { 30 switch (item.getItemId()) { 31 case R.id.red: 32 item.setChecked(true); 33 textView.setBackgroundColor(Color.RED); 34 break; 35 case R.id.black: 36 item.setChecked(true); 37 textView.setBackgroundColor(Color.BLACK); 38 break; 39 case R.id.blue: 40 item.setChecked(true); 41 textView.setBackgroundColor(Color.BLUE); 42 break; 43 } 7 5 第3章 常用的UI组件介绍 44 return true; 45 } 46 47 @Override 48 protected void onDestroy() { 49 super.onDestroy(); 50 unregisterForContextMenu(textView); 51 } 52 } 上述Java代码中重写了onCreateContextMenu()与onContextItemSelected()方法,分 图3.2 上下文菜单运行结果 别用于实现加载上下文菜单、菜单的点击事件,代码中两处 的粗体部分,分别是注册和解绑上下文菜单,可能读者会疑 惑为什么要在onDestroy()中解绑,在后文讲解Activity时 一并讲解。程序运行结果如图3.2所示。 上下文菜单需长按注册的组件才能出现,这一点和选 项菜单不同。希望读者认真练习例3.2中的代码。 3.1.3 弹出式菜单 默认情况下,PopupMenu会在指定组件的上方或下方 弹出。PopupMenu可增加多个菜单项,并可为菜单项增加 子菜单。 使用PopupMenu的步骤与前两种Menu不同,步骤 如下: (1)调用new PopupMenu(Contextcontext,View anchor)创建下拉菜单,anchor代表要激发弹出菜单的 组件。 (2)调用MenuInflater的inflate()方法将菜单资源填 充到PopupMenu中。 (3)调用PopupMenu的show()方法显示弹出式菜单。 接下来,通过例3.3所示学习弹出式菜单。 例3.3 XML文件中的弹出式菜单popup_menu.xml 1 2 3 6 Android 移动开发与项目实战(微课视频版) 7 6 9 12 15 界面布局文件中只有一个Button,在Button标签下直接设置点击事件popupMenuClick, 代码如下所示。 1 2 67