Download presentation
Presentation is loading. Please wait.
1
第三章 Android高级界面控件(4) QQ群: Q Q号: 倚动软件工厂实验室
2
本讲主要内容 图片控件 列表控件 对话框 菜单
3
主要内容
4
3.2.4 ExpandableListView ExpandableListView扩展下拉列表
SimpleExpandableListAdapter的参数: 参数1:上下文对象Context; 参数2:一级列表集合,即省份的集合; 参数3:一级列表对应的布局文件; 参数4:就是map中的key,指定要显示的信息; 参数5:与参数4对应,指定显示信息的控件ID; 参数6:二级列表集合,即城市的集合; 参数7:二级列表对应的布局文件; 参数8:就是map中的key,指定要显示的信息; 参数9:与参数8对应,指定显示信息的控件ID; 注意:SimpleExpandableListAdapter可以实现扩展下拉列表的功能,但是不能显示图片 。
5
3.2.4 ExpandableListView ExpandableListView扩展下拉列表 通过自定义Adapter实现,关
组的图标groupImgs[] 组的图标groupImgs[] 组的图标groupImgs[] 组的图标groupImgs[] 组的文字type[] 组的文字type[] 组的文字type[] 组的文字type[] ExpandableListView扩展下拉列表 通过自定义Adapter实现,关 键是要重写以下两个方法。 每组下的文字info[][] 每组下的图标imgIds[][] getGroupView() getChildView() 每组下的文字info[][] 每组下的文字info[][] 每组下的文字info[][] 每组下的文字info[][] 每组下的文字info[][] 每组下的图标imgIds[][] 每组下的图标imgIds[][]
6
3.2.4 ExpandableListView 1.在布局文件中添加一个扩展下拉列表,代码如下。
..\res\layout\activity_main.xml <LinearLayout xmlns:android=" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ExpandableListView android:layout_height="fill_parent"/> </LinearLayout> →为ExpandableListView命名 →高度为填充父容器 →宽度为填充父容器
7
ExpandableListView 2.在MainActivity代码中,定义扩展下拉列表所需要的资源。再根据findViewById()方法获取该ExpandableListView。 public class MainActivity extends Activity { String[] type = new String[] { "我的好友", "大学同学", "亲戚朋友" }; String[][] info = new String[][] { { "张三", "张四", "张五" }, { "李四", "李斯" }, { "王五", "王六", "王二", "王三" } }; int[] groupImgs = new int[] { R.drawable.g1, R.drawable.g2, R.drawable.g3}; int[][] imgIds = new int[][] { { R.drawable.a1, R.drawable.a2, R.drawable.a3 }, { R.drawable.a4, R.drawable.a5, R.drawable.a6 }, { R.drawable.a7, R.drawable.a8, R.drawable.a9, R.drawable.a10 } }; private ExpandableListView myExpandable; →定义组显示的文字 →定义每一组的内容,注意:每一组项的个数可以不一致 →组的图标 →每一项的图标
8
ExpandableListView 以下放在Activity 下面的onCreate()方法中 ExpandableListAdapter myAdapter = new BaseExpandableListAdapter() { public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } public boolean hasStableIds() { return false; private TextView getTextView() { AbsListView.LayoutParams lp = new AbsListView.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); TextView textView = new TextView(MainActivity.this); textView.setLayoutParams(lp); textView.setGravity(Gravity.CENTER_VERTICAL); textView.setTextSize(20); textView.setPadding(30, 0, 0, 0); textView.setTextColor(Color.BLACK); return textView; →子项是否可以选择 →自己定义的一个获取TextView的方法 →设置宽度和高度 →文字水平居中 →设置文字大小为20sp →设置左边距为30pt →设置本文颜色 →获取自定义的文本控件
9
ExpandableListView 设置一个组的图源+文字,使之成为一个线性布局 public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { LinearLayout layout = new LinearLayout(MainActivity.this); layout.setOrientation(LinearLayout.HORIZONTAL); layout.setGravity(Gravity.CENTER_VERTICAL); ImageView groupImg=new ImageView(MainActivity.this); groupImg.setImageResource(groupImgs[groupPosition]); layout.addView(groupImg); TextView textView = getTextView(); textView.setText(getGroup(groupPosition).toString()); layout.addView(textView); return layout; } →线性布局 →设置线性布局方向:图→文字 →设置垂直居中 →创建一个ImageView →设置ImageView的图片 →在线性布局中添加图片 →得到一个TextView →设置TextView显示内容 调用后面的getGroup(int groupPosition)方法,返回存储作为组类型名的一个字符串type[groupPosition] →在布局中添加TextView →返回整个线性布局控件
10
3.2.4 ExpandableListView public long getGroupId(int groupPosition) {
return groupPosition; } public int getGroupCount() { return type.length; public Object getGroup(int groupPosition) { return type[groupPosition]; public int getChildrenCount(int groupPosition) { return info[groupPosition].length; →获取组的Id →获取组的个数 →获取自定组对象 →获取指定组的项数
11
ExpandableListView 设置一个子项的图源+文字,使之成为一个线性布局 public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { LinearLayout layout = new LinearLayout(MainActivity.this); layout.setOrientation(LinearLayout.HORIZONTAL); layout.setPadding(20, 0, 0, 0); ImageView itemImage = new ImageView(MainActivity.this); itemImage.setPadding(20, 0, 0, 0); itemImage.setImageResource(imgIds[groupPosition][childPosition]); layout.addView(itemImage); TextView textView = getTextView(); textView.setText(getChild(groupPosition, childPosition).toString()); layout.addView(textView); return layout; } →线性布局 →设置线性布局方向 →设置线性布局的左边距 →创建图片视图 →设置图片的左边距 →在线性布局中添加图片 →获取文本显示框 调用后面的getChild(int groupPosition, int childPosition)方法,返回存储作为子项类型名的一个字符串info[groupPosition][childPosition] →在布局中添加文本控件 →返回线性布局
12
ExpandableListView public long getChildId(int groupPosition, int childPosition) { return childPosition; } public Object getChild(int groupPosition, int childPosition) { return info[groupPosition][childPosition]; →获取子项的Id →获取指定组中指定序号的项 3.最后,将我们的扩展下拉列表与我们的适配器进行关联。 myExpandable=(ExpandableListView)findViewById(R.id.myExpandable); myExpandable.setAdapter(myAdapter);
13
3.3 对话框 对话框是漂浮在Activity之上的小窗口,此时,Activity会失去焦点,而对话框会获取焦点。对话框通常用于通知,它会临时打断用户,执行一些与应用程序相关的小任务,例如任务执行进度或登录提示等。(是object类,不是view类) Android中,主要的对话框有以下四种: AlertDialog:警示框,功能最丰富、应用最广的对话框,该对话框可以包含0~3个按钮,或者是包含复选框或单选按钮的列表。 ProgressDialog:进度对话框,主要用于显示进度信息,以进度环或进度条的形式显示任务执行进度; DatePickerDialog:日期选择对话框,允许用户选择日期; TimePickerDialog:时间选择对话框,允许用户选择时间。
14
3.3.1 对话框简介 AlertDialog是Dialog的子类,它能创建大部分用户交互的对话框,也是系统推荐的对话框类型。
简单提示对话框 单选列表对话框 多选列表对话框
15
3.3.1 对话框简介 自定义输入对话框框 自定义列表对话框
16
3.3.1 对话框简介 如果要想实例化AlertDialog类往往需依靠其内部类:AlertDialog.Builder完成。使用AlertDialog创建对话框大致按如下步骤进行: 第1步:创建AlertDialog.Builder对象,该对象是AlertDialog的创建器。 第2步:调用AlertDialog.Builder方法为对话框设置图标、标题、内容等。 第3步:调用AlertDialog.Builder的create()方法创建AlertDialog对话框 第4步:调用AlertDialog的show()方法显示对话框。
17
3.3.1 对话框简介 Builder内部类的主要方法如下: 方法名 作用 public Builder setTitle 设置对话框标题
public Builder setMessage 设置对话框内容 public Builder setIcon 设置对话框图标 public Builder setPositiveButton 添加肯定按钮(Yes) public Builder setNegativeButton 添加否定按钮(No) public Builder setNeutralButton 添加普通按钮 注意:很多方法的返回类型都是Builder类型,Builder对象每调用一个方法就是为对话框添加一些内容,是对对话框的不断完善,调用方法就是构造对话框的过程,每次返回的都是已构建好的对话框。
18
3.3.2 创建对话框 当程序中存在两个名称相同,包不同的类或接口时,应该怎么办? 程序中存在两种单击事件,一个是普通按钮的单击事件、一个是对话框中按钮的单击事件,两种事件的监听器是不一样的,一个是View.OnClickListener接口,一个是DialogInterface.OnClickListener接口,但它们的监听器接口名却都是OnclickListener,导入包时,只能导入一个接口,另一个必须用完整的包名+接口名才能引用,否则程序会认为引用的是导入的那个接口,从而导致编译不通过。
19
3.3.2 创建对话框 下面以一个简单的例子讲解AlertDialog的创建过程。单击退出按钮时,弹出提示对话框,提示用户是否确定要退出,单击按钮后,使用Toast显示相应的信息。 具体实现过程如下,首先获取按钮控件,创建 Builder对象。 simpleDialog = (Button) findViewById(R.id.simpleDialog); final Builder builder = new AlertDialog.Builder(this);
20
3.3.2 创建对话框 然后在按钮单击事件中,通过Builder对象来设置对话框的一些属性,包括对话框的内容,按钮等,并通过Builder对象创建和显示对话框。 simpleDialog.setOnClickListener(new OnClickListener() { public void onClick(View v) { builder.setMessage("Are you sure you want to exit?"); builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "单击了确定!", 1000).show(); } }); builder.setNegativeButton("No", public void onClick(DialogInterface dialog,int which) { Toast.makeText(MainActivity.this, "单击了取消!",1000).show(); builder.show(); →为按钮添加单击事件 →对话框内容 →添加yes按钮 →单击事件处理 →消息提示 →添加no按钮 →单击事件处理 →消息提示 →builder.create()
21
3.3.2 创建对话框 对话框中包含三种类型的按钮,能否重复添加?按钮有什么作用? 在AlertDialog对话框中,每种类型的按钮最多只有一个,也就是说,在AlertDialog对话框中不可能同时存在两个以上的“PositiveButton”,后面添加的会覆盖前面的。因此,对话框中按钮的数量最多为三个:肯定、否定、中性。这些名字和实际功能并没有联系,只是帮助记忆每个按钮主要做什么事。 如何解决单击Back建退出对话框的问题? 只需在构建时,添加builder.setCancelable(false)即可
22
3.3.2 创建对话框 AlertDialog对话框除了可以提示信息外,还可以让用户进行选择和输入。下面介绍如何创建带有单选按钮列表的对话框。在上述程序界面中添加一个选择状态的按钮,运行效果如下图。 statusText = (TextView) findViewById(R.id.statusInfo); →获取选择状态的按钮
23
3.3.2 创建对话框 statusText = (TextView) findViewById(R.id.statusInfo);
statusText = (TextView) findViewById(R.id.stastusText); →获取选择状态按钮 status.setOnClickListener(new OnClickListener() { public void onClick(View v) { final String[] items = new String[] { "在线", "隐身", "离开", "忙碌","离线", "其他" }; Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setTitle("请选择你的状态"); builder.setIcon(R.drawable.ic_launcher); builder.setCancelable(false); builder.setSingleChoiceItems(items, 1, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { if (which == (items.length - 1)) { Builder myBuilder = new Builder( MainActivity.this); final EditText myInput = new EditText( myBuilder.setTitle("请输入你的状态"); myBuilder.setIcon(R.drawable.ic_launcher); myBuilder.setView(myInput); myBuilder.setPositiveButton("确定",new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog,int which) { statusText.setText("你当前的状态是:"+ myInput.getText().toString()); } }); →为按钮添加单击事件 →列表项 →创建Builder对象 →设置对话框标题 →设置对话框图标 →设置对话框不能取消 →设置单选列表,包括列表项,默认选中项,单击事件处理 statusText = (TextView) findViewById(R.id.statusInfo); →添加确定按钮
24
3.3.2 创建对话框 创建Builder对象时,为什么有时传的是MainActivity.this, 而有时传的是this?
在Java中this表示当前类的对象,通常有两种用法: 1、代表当前类的对象,使用this.***; 2、引用当前类的其他构造方法,通常使用this(***)。 如果Builder对象的创建是放在MainActivity的onCreate()方法中,此时this代表的就是MainActivity对象。 如果Builder对象的创建是放在View.OnClickListener的匿名内部类中,this代表的是该匿名内部类对象。 而Builder对象的创建需要传递一个Context类型的参数,MainActivity是Context类的子类,可以作为参数进行传递,在内部类中需要使用外部类的对象时,需使用外部类的类名.this。
Similar presentations