• 1. Android应用程序界面编程主讲:王亭
  • 2. 界面编程与视图(View)组件Android应用的所有UI组件都继承自View类。 ViewGroup也是继承自View类,但是ViewGroup主要用作其他UI控件的容器。
  • 3. 界面编程与视图(View)组件ViewGroupViewGroupViewViewViewViewViewView和ViewGroup的关系
  • 4. Android SDK文档的阅读Android SDK文档在安装目录里doc目录下。
  • 5. 使用XML布局控制UI界面Android推荐使用XML布局文件来控制视图。 将视图控制逻辑从Java代码中分离出来,放入XML文件中控制,体现了MVC的设计思想。 通过如下代码在Activity中显示视图: setContentView(R.layout.<资源文件名>); 通过如下方法访问指定的UI组件: findViewById(R.id.<组件id>);
  • 6. 在代码中控制UI界面Android允许开发者在代码中控制UI界面。 例子CodeView中描述了在代码中完全控制UI界面。
  • 7. 使用XML和Java代码共同控制UI界面在Java中控制UI界面繁琐,不利于解耦 。 在XML布局文件中控制UI界面虽然方便,但不够灵活。 使用XML布局文件和Java代码共同控制UI界面,可以达到跟好的效果。
  • 8. 开发自定义的View当Android系统提供的UI不能满足需求时,就可以通过继承View类来自定义UI组件。 重写View类的一个或多个方法。 重要方法: onDraw(Canvas): 绘制组件的内容 onKeyDown(int,KeyEvent): 某个键被按下 onTouchEvent(MotionEvent): 发生触摸事件 ……
  • 9. ——基本界面组件
  • 10. 文本框(TextView)TextView的作用是在界面上显示文字。 常用属性: android:ellipsize 设置当文本超出了TextView的长度时如何处理 android:drawableLeft 在文本框左边绘制指定图像
  • 11. 文本框(TextView)android:autoLink 设置文本的链接属性。(none:不设置超链接,web:将文本中的URL地址转换为链接,phone:将文本中的电话转换为链接,map:将文本中的街道地址转换为链接)。 android:hint 当文本框内容为空时,默认的提示文字。
  • 12. 编辑框(EditText)编辑框的主要作用是接收用户的输入。 编辑框继承自文本框,因此支持文本框的所有属性。 常用属性: android:editable 设置该文本框是否可编辑 android:singleLine是否为单行模式
  • 13. 编辑框(EditText)android:password 将文本框设置为密码框 android:hint 当文本框为空时,默认的提示文字 android:digits 设置文本框能接收的字符 android:phoneNumber 设置文本框只能接受电话号码
  • 14. 按钮(Button)按钮的主要作用是响应用户的单击事件,当用户单击按钮,按钮会触发一个OnClick事件。 常用属性: android:background 设置背景颜色或背景图片 android:src 链接到一个资源文件,为按钮设置动态效果
  • 15. 按钮(Button)响应用户的单击事件: mybtn =(Button)findViewById(R.id.mybtn); mybtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 处理事件 } });
  • 16. 图片按钮(ImageButton)图片按钮( ImageButton )继承自按钮(Button),两者的区别是图片按钮上不可显示文字。 常用属性: android:img 设置按钮上显示的图片
  • 17. 使用9Patch图片作为按钮背景当按钮的尺寸和背景图片大小不一时,android会对背景进行缩放,缩放之后的效果可能和原来差别很大,这是我们就需要使用android SDK提供的draw9patch工具对图片进行处理,使图片进行局部缩放。
  • 18. 单选按钮(RadioButton)RadioGroup是一个单选按钮组,组中的每一个RadioButton代表一个选项。 每一组中最多只有一个RadioButton可以被选中 常用属性: android:checked 初始状态是否被选中。
  • 19. 单选按钮(RadioButton)响应onCheckedChanged事件: myRadioGroup = (RadioGroup)findViewById(R.id.myRadioGroup); myRadioButton1 = (RadioButton)findViewById(R.id.myRadioButton1); myRadioButton2 = (RadioButton)findViewById(R.id.myRadioButton2); myRadioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { // 处理事件 if (checkedId == myRadioButton1.getId()) {sex ="男";} if (checkedId == myRadioButton2.getId()) {sex ="女";} } });
  • 20. 复选按钮(CheckBox)复选按钮(CheckBox)中可以有多个选项被选中。 常用属性: android:checked 初始状态是否被选中。
  • 21. 状态开关按钮(ToggleButton)ToggleButton有两种状态,开和关,通常用于切换程序中的某种状态。 常用属性: android:checked 设置该按钮是否被选中 android:textOff 当按钮没被选中时显示的文本 android:textOn 当按钮被选中时显示的文本
  • 22. 状态开关按钮(ToggleButton)响应onCheckedChanged事件 ToggleButton toggle=(ToggleButton)findViewById(R.id.toggle); toggle.setOnCheckedChangeListener(new OnCheckedChangeListener(){ @Override public void onCheckedChanged(CompoundButton arg0, boolean arg1){ // 处理事件 } });
  • 23. 时钟(AnalogClock和DigitalClock)时钟组件的功能是在界面上显示当前时间。 时钟组件分为模拟时钟和数字时钟。 模拟时钟不能显示当前秒数。
  • 24. 计时器(Chronometer)计时器组件并不显示当前时间。它显示从某个时间开始,一共过去了多少时间。 常用方法: setBase(long base): 设置起始时间 setFormat(String format):设置时间格式
  • 25. 计时器(Chronometer)start():开始计时 end():停止计时 setOnChronometerTickListener(Chronometer.OnChronometerTickListener listener):为计时器绑定事件监听器,当计时器改变时触发该监听器。
  • 26. 图像视图(ImageView)ImageView的主要功能是显示图片。 常用属性: android:adjustViewBounds 是否调整自己的边界来保持所显示图片的长宽比 android:src 设置所显示的图片对象id
  • 27. 图像视图(ImageView)android:scaleType 设置所显示的图片如何缩放或移动以适应ImageView的大小。属性值如下: fitXY:对图片横向、纵向独立缩放。 fitStart:保持纵横比缩放,图片放在ImageView左上角。 fitCenter:保持纵横比缩放,图片放在ImageView中央。 fitEnd: 保持纵横比缩放,图片放在ImageView右下角。 center:把图片放在ImageView中间,不进行任何缩放。 centerCrop:保持纵横比缩放,图片完全覆盖ImageView。 centerInside:保持纵横比缩放,ImageView能完全显示该图片。
  • 28. ——布局管理器
  • 29. 布局管理器Android布局管理器本身就是一个UI组件。 所有的布局管理器都是继承自ViewGroup类。 布局管理器可以相互嵌套。 常用的布局管理器: LinearLayout TableLayout FrameLayout RelativeLayout AbsoluteLayout
  • 30. 布局管理器ViewViewGroupAbsolutionLayoutLinearLayoutTableLayoutRelativeLayoutFrameLayout
  • 31. 线性布局(LinearLayout)容器内的控件一个挨着一个排列。 重要属性: android:orientation 设置容器内控件排列方式,水平排列或者垂直排列。 android:gravity 设置容器内的组件的对齐方式,组件相对于容器的位置。
  • 32. 表格布局(TableLayout)表格布局采用行、列的形式来管理UI组件。 TableRow表示每一行,TableRow中的每一个组件代表一列。 重要属性: android:collapseColumns 设置被隐藏的列 android:shrinkColumns 设置允许收缩的列 android:stretchColumns 设置允许拉伸的列
  • 33. 帧布局FrameLayout帧布局容器为每个加入其中的组件创建一个空白区域(称为一帧)。 如果没有设置对齐方式,容器中的组件会重叠在一起。 重要属性: android:foreground 设置该帧布局容器的前景图 android:foregroundGravity 设置帧布局前景图的位置
  • 34. 相对布局RelativeLayout相对布局容器内子组件的位置总是相对于其他组件和父容器决定。 控制组件位置的属性 android:layout_centerHorizontal 控制组件是否在容器中水平局中 android:layout_centerVertical 控制组件是否在容器中垂直局中 ……
  • 35. 绝对布局AbsoluteLayout绝对布局中,系统不提供任何布局控制,开发人员通过X坐标,Y坐标来控制组件的位置。 Android手机屏幕的尺寸和分辨率差别很大,使用绝对布局很难适应不同的屏幕分辨率。
  • 36. Android中的长度单位px(像素):每个像素对应屏幕上的一个点。 dip或dp(设备独立像素):基于屏幕密度的抽象单位。 sp(比例像素):主要处理字体大小,可对字体进行缩放。 其他:in(英寸)、mm(毫米)、pt(磅)
  • 37. ——高级界面组件
  • 38. 自动完成文本框(AutoCompleteTextView)自动完成文本框继承自EditText。 具有自动提示功能。 常用属性: android:completionHint 出现在下拉菜单中的提示标题 android:completionThreshold 至少输入几个字符才会显示提示
  • 39. 自动完成文本框(AutoCompleteTextView)android:dropDownHeight 设置下拉菜单的高度 android:dropDownWidth 设置下拉菜单的宽度 android:popupBackground 设置下拉菜单的背景 android:dropDownHorizontalOffset 设置下拉菜单与文本框之间的水平偏移 android:dropDownVerticalOffset 设置下拉菜单与文本框之间的垂直偏移
  • 40. 自动完成文本框(AutoCompleteTextView)用适配器为自动完成文本框添加数据 //创建一个ArrayAdapter适配器,封装数组 ArrayAdapter myAdapter = new ArrayAdapter( this, android.R.layout.simple_dropdown_item_1line, books); AutoCompleteTextView actv = (AutoCompleteTextView)findViewById(R.id.auto); //设置Adapter actv.setAdapter(myAdapter);
  • 41. 下拉列表(Spinner)用户点击Spinner,会弹出一个下拉列表式的选择框。 常用属性: android:prompt 设置选择框的标题。 android:entries 使用数组资源设置下拉列表的列表项目。
  • 42. 下拉列表(Spinner)使用适配器为Spinner添加选择框的数据 Spinner spinner1 = (Spinner) findViewById(R.id.Spinner01); ArrayAdapter adapter = ArrayAdapter.createFromResource( this, R.array.colors, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner1.setAdapter(adapter);
  • 43. 日期选择器(DatePicker)DatePicker主要供用户选择日期。 可以为DatePicker添加OnDateChangedListener监听。
  • 44. 时间选择器(TimePicker)TimePicker主要供用户选择时间。 如果程序需要获取用户选择的时间,可以为TimePicker添加OnTimerChangedListener监听来实现。
  • 45. 进度条(ProgressBar)ProgressBar的主要作用是向用户显示某个比较耗时的操作的进度。 常用属性: android:max 设置进度条的最大值 android:progress 设置进度条已完成的进度
  • 46. 进度条(ProgressBar)style 进度条的样式,属性值: @android:style/Widget.ProgressBar.Horizontal 水平进度条 @android:style/Widget.ProgressBar.Inverse 旋转的进度条 @android:style/Widget.ProgressBar.Large 大进度条 @android:style/Widget.ProgressBar.Small 小进度条 常用方法: setProgress(int): 设置进度完成的百分比 incrementProgressBy(int): 设置进度增加或减少
  • 47. 拖动条(SeekBar)SeekBar允许用户拖动滑块来改变值,如调节音量等。 常用属性: android:max 设置拖动条的最大值。 android:progress 设置拖动条当前进度。 android:thumb 指定一个图片当作拖动条的滑块。
  • 48. 拖动条(SeekBar)为SeekBar添加OnSeekBarChangeListener监听器: seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){ //当拖动条的滑块位置发生改变时触发该方法 @Override public void onProgressChanged(SeekBar arg0 , int progress, boolean fromUser){ //处理事件 } @Override public void onStartTrackingTouch(SeekBar bar){} @Override public void onStopTrackingTouch(SeekBar bar){} });
  • 49. 星级评分条(RatingBar)RatingBar的主要用来评分。 常用属性: android:numStars 设置评分条有多少个星级。 android:rating 设置评分条默认的星级。 android:stepSize 设置每次需要改变多少星级。
  • 50. 星级评分条(RatingBar)android:isIndicator 设置星级评分条是否允许用户改变。 为RatingBar绑定OnRatingBarChangeListener监听器,即可监听星级的改变。
  • 51. 选项卡(TabHost)TabHost可以在窗口上放置多个标签,方便切换。 TabHost仅仅是一个简单的容器,它提供了如下两个方法来创建选项卡、添加选项卡: newTabSpec(String tag): 创建选项卡 addTab(TabHost.TabSpec tabSpec) :添加选项卡
  • 52. 选项卡(TabHost)使用TabHost的一般步骤: 在界面布局中定义TabHost组件。 Activity应继承自TabActivity。 调用TabActivity的getTabHost()方法获取TabHost对象。 通过TabHost对象的方法来创建选项卡、添加选项卡。
  • 53. 滚动视图(ScrollView)ScrollView的作用是为其他组件添加滚动条。 ScrollView里最多只能包含一个组件。 ScrollView只能添加垂直滚动条,如果要添加水平滚动条,则需要HorizontalScrollView。
  • 54. 列表视图(ListView)ListView以垂直列表的形式显示所有的列表项。 常用属性: android:divider 设置List列表的分割条(颜色或图片)。 android:dividerHeight 设置分割条的高度。 android:entries 指定要显示的数组资源。
  • 55. 列表视图(ListView)使用适配器为ListView添加数据: ListView list1 = (ListView)findViewById(R.id.list2); //定义一个数组 String[] arr ={“列表视图" , "列表视图" , "列表视图"}; //将数组包装ArrayAdapter ArrayAdapter arrayAdapter = new ArrayAdapter( this , android.R.layout. simple_list_item_1 , arr); //为ListView设置Adapter list1.setAdapter(arrayAdapter);
  • 56. 可展开列表组件(ExpandableListView)ExpandableListView继承自ListView,它可以把列表分组,每组里又可以包含多个列表。 常用属性: android:childDivider 指定各组内子列表之间的分割条。 android:groupIndicator 指定组列表旁边的图像。
  • 57. 可展开列表组件(ExpandableListView)android:childIndicator指定子列表旁边的图像。 创建BaseExpandableListAdapter对象为列表添加数据。
  • 58. 网格视图(GridView)GridView用于在界面上按行、列分布的方式显示多个组件。 常用属性: android:columnWidth 设置列的宽度。 android:numColumns 设置列数
  • 59. 网格视图(GridView)android:stretchMode 设置拉伸模式。 android:horizontalSpacing 设置各元素之间的水平间距。 android:verticalSpacing 设置各元素之间的垂直间距。
  • 60. 画廊视图(Gallery)Gallery允许用户通过拖动来查看上一个、下一个列表项。 常用属性: android:animationDuration 设置列表项切换时动画持续的时间。 android:spacing 设置列表项之间的距离
  • 61. 画廊视图(Gallery)android:unselectedAlpha 设置没有选中的列表项的透明度。 Gallery使用Adapter提供数据。 如果要监听Gallery选择项的改变,只要为Gallery添加OnItemSelectedListener即可。
  • 62. ——对话框
  • 63. 对话框Android提供了四种常用的对话框 AlertDialog ProgressDialog DatePickerDialog TimePickerDialog
  • 64. 使用AlertDialog创建对话框Android提供了丰富的对话框支持。 通过AlertDialog可以创建基本的对话框。 常用方法: setIcon(Drawable icon): 设置对话框的图标。 setTitle(String title): 设置对话框的标题。
  • 65. 使用AlertDialog创建对话框setMessage(String message): 设置对话框的内容。 使用AlertDialog创建对话框的一般步骤: 创建AlertDialog.Builder对象。 调用AlertDialog.Builder的方法为对话框设置图标、标题、内容等。 调用AlertDialog.Builder的create()方法创建AlertDialog对话框。 调用AlertDialog.Builder的show()方法显示对话框。
  • 66. 使用AlertDialog创建对话框AlertDialog除了可以创建简单的对话框,还可以创建如下复杂对话框: 带列表、按钮的列表对话框。 带多个单选列表项的对话框。 带多个多选列表项的对话框。 自定义界面的对话框。
  • 67. PopupWindowPopupWindow用于创建类似于对话框风格的窗口。 使用PopupWindow创建对话框风格的窗口需要两步: 调用PopupWindow构造器创建PopupWindow对象。 调用PopupWindow的showAsDropDown(View v)或showAtLocation显示PopupWindow。
  • 68. 日期选择对话框(DatePickerDialog)日期选择对话框只是将日期选择组件包装为对话框的形式。 通过new关键字创建DatePickerDialog实例,调用它的show()方法即可显示。 为DatePickerDialog绑定监听器。
  • 69. 时间选择对话框(TimePickerDialog)时间选择对话框的使用方法和日期选择对话框的使用方法和基本相同。
  • 70. 进度对话框(ProgressDialog)进度条对话框是以对话框的方式显示进度。 常用方法: setMax(int max):设置对话框进度条的最大值。 setMessage(CharSequence message):设置对话框里显示的消息。
  • 71. 进度对话框(ProgressDialog)setProgress(int value):设置对话框里进度条的进度。 setProgressStyle(int Style):设置对话框里进度条的风格。 setIndeterminate(boolean indeterminate):设置对话框里的进度条不显示进度值。
  • 72. ——消息提示
  • 73. Toast提示Toast是在界面上显示一个简单的提示信息。 Toast提示信息不会获得焦点。 使用Toast生成提示消息的步骤:
  • 74. Toast提示调用Toast的构造器或makeText方法创建Toast对象。 调用Toast的方法设置提示消息的对齐方式、页边距、显示的内容。 调用Toast的show()方法将它显示出来。 Toast提供了一个setView()方法,允许开发者自定义Toast显示的内容。
  • 75. Notification提示Notification是显示在手机状态栏的消息。 Notification表示一种全局的通知。 使用Notification的步骤:
  • 76. Notification提示调用getSystemService(NOTIFICATION_SERVICE)获取系统NotificationManager服务。 通过构造器创建一个Notification对象。 为Notification设置各种属性。 通过NotificationManager发送Notification。 通过Notification的defaults属性可以设置提示声音、振动、闪光灯等。
  • 77. ——菜单
  • 78. 选项菜单(SubMenu)选项菜单是在点击“MENU”按键显示的菜单。 最多只有6个菜单位,超过6个会显示“更多”。
  • 79. 选项菜单(SubMenu)添加选项菜单的步骤: 重写Activity的onCreateOptionsMenu(Menu menu)方法。 重写Activity的onOptionsItemSelected(MenuItem mi)方法,响应菜单的单击事件。
  • 80. 上下文菜单(ContextMenu)当一个View注册了上下文菜单时,长按此View即可显示上下文菜单。
  • 81. 上下文菜单(ContextMenu)开发上下文菜单的步骤: 重写Activity的onCreateContextMenu(ContextMenu menu,View v,ContextMenuInfo menuInfo)方法。 调用Activity的registerForContextMenu(View view)方法为View组件注册上下文菜单。 重写Activity的onContextItemSelected(MenuItem item)方法,响应菜单的单击事件。
  • 82. 谢谢大家!