事件驱动机制高级UI消息提示机制.docx
《事件驱动机制高级UI消息提示机制.docx》由会员分享,可在线阅读,更多相关《事件驱动机制高级UI消息提示机制.docx(30页珍藏版)》请在冰豆网上搜索。
事件驱动机制高级UI消息提示机制
Android基础
三、Android事件驱动机制2
3.1点击事件2
3.1.1点击事件四种书写方式2
3.2选择事件4
3.2.1复选事件4
3.2.2单选事件5
3.2.3下拉列表选择5
3.3长按与触屏事件6
3.4键盘事件7
四、Android高级UI8
4.1ProgressBar8
4.2RatingBar8
4.3ToggleButton9
4.4ScrollView10
4.5ListView10
五、Android消息提示机制12
5.1Logcat日志猫13
5.2Toast瞬时提示13
5.3对话框15
5.3.1标准对话框15
5.3.2菜单式对话框17
5.3.3复选对话框18
5.3.4自定义对话框21
5.3.5对话框优化22
三、Android事件驱动机制
一般,用户经常会通过界面与应用交互,Android框架一般采用事件驱动的形式与用户交互,那如何处理用户界面中触发的事件?
可以通过从用户交互的View设置事件监听器的方式来实现对事件的处理,一个事件监听器是View类中一个包含单一回调方法的接口。
当注册了监听器的View发生了对应的监听事件时,Android框架就会回调相应的监听方法,实现与用户的交互
*常见的用户事件
点击事件、选择事件、触屏事件、长按事件、按键事件
3.1点击事件
单击事件是事件机制中最常见的事件,通过对控件绑定View.OnClickListener实现单击事件的监听
3.1.1点击事件四种书写方式
&私有类实现方式
&匿名内部类实现方式
&布局中对控件添加android:
onClick
&Activity实现监听接口
*案例:
对按钮按键监听
对四个按钮实现监听,分别用四种不同的书写方式实现单击监听事件
*界面设计
*代码实现
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_click_event);
//1.通过内部类形式实现
inner();
//2.通过匿名内部类形式实现
anonymouns();
//4.Activity实现监听接口方式
Buttonbutton=(Button)findViewById(R.id.activity);
button.setOnClickListener(this);
}
/**
*通过匿名内部类形式实现单击监听
*/
privatevoidanonymouns(){
Buttonbutton=(Button)findViewById(R.id.anonymouns);
button.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
Toast.makeText(ClickEventActivity.this,"匿名内部类实现方式",Toast.LENGTH_SHORT).show();
}
});
}
//通过内部类的方式实现
privatevoidinner(){
Buttonbutton=(Button)findViewById(R.id.inner);
button.setOnClickListener(newMyListener());
}
//3.通过XML方式实现
publicvoidclickByXml(Viewv){
Toast.makeText(ClickEventActivity.this,"布局中设置onClick属性实现方式",Toast.LENGTH_SHORT).show();
}
privateclassMyListenerimplementsView.OnClickListener{
@Override
publicvoidonClick(Viewv){
Toast.makeText(ClickEventActivity.this,"内部类实现方式",Toast.LENGTH_SHORT).show();
}
}
//4、通过对Activity实现单击监听接口实现方式
@Override
publicvoidonClick(Viewv){
Toast.makeText(ClickEventActivity.this,"Activity实现监听接口方式",Toast.LENGTH_SHORT).show();
}
3.2选择事件
3.2.1复选事件
复选事件的监听接口:
CompoundButton.OnCheckedChangeListener
复选控件CheckBox有两种状态:
选中与未选中状态,对复选控件
*案例:
明密文切换
通过对CheckBox控件的复选监听,实现对EditText内容明密文切换
*界面设计
*代码实现
/*
*通过对CheckBox复选监听实现明密文切换
*/
privatevoidcheckBox(){
finalEditTextinfoEdt=(EditText)findViewById(R.id.info_edt);
CheckBoxcheckBox=(CheckBox)findViewById(R.id.checkbox);
checkBox.setOnCheckedChangeListener(new
CompoundButton.OnCheckedChangeListener(){
@Override
publicvoidonCheckedChanged(CompoundButtonbuttonView,
booleanisChecked){
if(isChecked){
////把EditText隐藏的文本内容还原
infoEdt.setTransformationMethod(new
HideReturnsTransformationMethod());
}else{
//把EditText的内容用密码的方式隐藏起来
infoEdt.setTransformationMethod(new
PasswordTransformationMethod());
}
}
});
}
3.2.2单选事件
单选事件的监听接口:
RadioGroup.OnCheckedChangeListener
RadioButton与RadioGroup组合使用才能实现单选功能
*案例:
选择字符集
通过对RadioButton控件的选择监听,实现对字符集的选择
*界面设计
*代码实现
privatevoidsingleCheck(){
finalTextViewcharSet=(TextView)findViewById(R.id.charSet);
RadioGroupradioGroup=(RadioGroup)findViewById(R.id.radioGroup1);
//对单选组添加选择监听事件
radioGroup.setOnCheckedChangeListener(newRadioGroup.
OnCheckedChangeListener(){
/**选择状态改变监听
*RadioGroup:
单选组
*checkedId:
被改变的控件的资源id
*/
publicvoidonCheckedChanged(RadioGroupgroup,intcheckedId){
//通过通过findViewById找到所选择的RadioButton
RadioButtonradioButton=(RadioButton)findViewById(checkedId);
charSet.setText(radioButton.getText().toString());
}
});
}
3.2.3下拉列表选择
下拉事件的监听接口:
AdapterView.OnItemSelectedListener
*案例:
城市选择
通过对Spinner下拉列表监听,实现对城市的选择
*界面设计
*代码实现
privatevoidspinner(){
//通过资源ID获得字符串数组
finalString[]citys=getResources().getStringArray(R.array.city);
Spinnerspinner=(Spinner)findViewById(R.id.spinner);
spinner.setPrompt("请选择城市");
spinner.setOnItemSelectedListener(newAdapterView.OnItemSelectedListener(){
@Override
/**下拉项选择监听
*AdapterView:
下拉项的父控件:
Spinner
*View:
当前选择的Item项
*Position:
选择项的位置
*id:
选择项的行号
*/
publicvoidonItemSelected(AdapterView
>parent,Viewview,
intposition,longid){
Toast.makeText(context,citys[position],Toast.LENGTH_SHORT).show();
}
@Override
publicvoidonNothingSelected(AdapterView
>arg0){
}
});
}
3.3长按与触屏事件
长按事件监听接口:
View.OnLongClickListener
触屏事件监听接口:
View.OnTouchListener
*案例:
长按图标设置手机桌面壁纸
clearWallpaper:
清除桌面壁纸
setWallpaper(BitMapbitmap):
设置桌面壁纸
设置壁纸要添加权限:
name="android.permission.SET_WALLPAPER"/>
*代码实现
privatevoidsetWallPaper(){
ImageViewimage=(ImageView)findViewById(R.id.image);
//对图片添加触屏监听
image.setOnTouchListener(newView.OnTouchListener(){
@Override
publicbooleanonTouch(Viewv,MotionEventevent){
System.out.println("触屏监听");
returnfalse;
}
});
//对图片添加长按监听,实现设置手机壁纸的功能
image.setOnLongClickListener(newView.OnLongClickListener(){
@Override
publicbooleanonLongClick(Viewv){
try{
//清除屏幕壁纸
clearWallpaper();
Bitmapbitmap=BitmapFactory
.decodeResource(getResources(),R.drawable.ic_launcher);
//设置壁纸
setWallpaper(bitmap);
}catch(IOExceptione){
e.printStackTrace();
}
System.out.println("长按监听");
returnfalse;
}
});
}
3.4键盘事件
Activity实现了KeyEvent.backcall接口
onKeyDown(intkeyCode,KeyEventevent):
当键按下去触发
onBackPress():
当返回键按下去触发,Activity的方法
模拟器常见的按键:
Back返回键
Home手机屏幕桌面
Ctrl+F11切换模拟器横竖屏幕
F2手机菜单
F3电话面板
F8手机网络开关
四、Android高级UI
4.1ProgressBar
ProgressBar进度条,常用于文件下载进度显示、系统初始化进度等,默认情况是没有进度值的(转圈圈)
*提示点:
style="@android:
style/Widget.ProgressBar.Horizontal"样式设置
setProgress(int)设置当前进度值
getProgress()得到当前进度值
setMax(int)设置最大值
案例:
通过按钮设置进度条进度
*界面设计:
*代码实现
//设置进度条的最大值
progressBar.setMax(10);
addBtn.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
//获得当前的进度值
intprogress=progressBar.getProgress();
//设置进度值
progressBar.setProgress(progress+1);
}
});
4.2RatingBar
RatingBar评分进度条,常用于对商品、用户的评价,比如满意度调查等
*提示点:
setOnRatingBarChangeListener设置监听器
setNumStars设置星星的个数(设置总分)
setStepSize设置分数间隔
getRating获得当前的分数值
setRating设置当前的分数值
案例:
对欧冠精彩程度打分
*界面设计:
*代码实现
//设置星星的数量
ratingBar.setNumStars(5);
//设置步长值
ratingBar.setStepSize(0.5f);
//添加评分控件值改变的监听
ratingBar.setOnRatingBarChangeListener(newRatingBar.OnRatingBarChangeListener(){
/**ratingBar:
评分控件
*rating:
当前的值
*fromUser:
是不是用户操作
*/
publicvoidonRatingChanged(RatingBarratingBar,floatrating,
booleanfromUser){
if(fromUser){
Log.v("RatingBarfromuser",rating+"");
}else{
Log.v("RatingBarnofromuser",rating+"");
}
}
});
4.3ToggleButton
ToggleButton:
开关按钮,它是CompoundButton的子类,实现开与关的效果,比如蓝牙开关、wifi开关、声音开关等
*提示点:
-实现的监听接口:
CompoundButton.OnCheckedChangeListener
该接口是监听开关按钮状态的改变
-toggle():
取反操作
-xml属性设置
textOn:
表示状态为开的提示文本
textOff:
表示状态为关的提示文本
案例:
设置声音开关
*界面设计
*代码实现
toggleButton.setOnCheckedChangeListener(newCompoundButton.OnCheckedChangeListener(){
/**选择状态改变的监听
*
*@parambuttonView:
toggleButton
*@paramisChecked:
表示当前的开关按钮控件的状态
*/
@Override
publicvoidonCheckedChanged(CompoundButtonbuttonView,booleanisChecked){
Toast.makeText(AdvanceUIActivity.this,isChecked?
"声音开":
"声音关",Toast.LENGTH_LONG).show();
//toggleButton.toggle();//取反,每一次点击开关按钮会自动取反
}
});
4.4ScrollView
ScrollView:
滚屏视图,它是FrameLayout的子类,能够被用户滚动的布局容器,它只能拥有一个子控件,经常应用于一个垂直方向的线性布局中。
ScrollView只支持垂直滚动,对于需要水平滚动,则用HorizontalScollView
4.5ListView
ListView列表框,常用控件,用来显示相同数据结构的批量数据,比如:
从数据库获取的数据列表,从网络解析的批量结构数据,一般都会采用ListView展示数据,系统中的设置、未接来电、通信录等显示可采用ListView进行展示
用ListView展示数据的四个步骤:
列表项描述、初始化数据、适配器数据装配、设置适配器
案例:
在ListView中显示好友列表
*界面设计与分析:
*代码实现
//引用ListView控件
ListViewsettingListView=(ListView)findViewById(R.id.setting_listView);
/**
*1、描述列表项,设置列表项的布局
*2、初始化数据:
ArrayList
*3、把数据通过数据适配器装配到ListView中
*/
//初始化数据
ArrayList>data=newArrayList>();
HashMapitem=null;
//生成假数据
for(inti=1;i<12;i++){
item=newHashMap();
item.put("icon",R.drawable.emoji_044+i);//添加的是图片资源的ID
item.put("title","设置"+i);
//向数组列表添加map
data.add(item);
}
//简单数据适配器
/**
*context:
上下文
*data:
数据源ArrayList
*resource:
列表项布局资源id
*from:
装配数据--数据从哪里来
*to:
装配数据--数据到那里去
*/
String[]from={"icon","title"};
int[]to={R.id.icon,R.id.title};
SimpleAdapteradapter=newSimpleAdapter(this,data,R.layout.setting_item,from,to);
//装配数据到ListView中,对ListView设置数据适配器
settingListView.setAdapter(adapter);
}
五、Android消息提示机制
在某些情况下,可能需要你去通知用户发生在你应用中的事件,其中一些事件需要用户响应,有的则不需要。
Android框架通过消息机制很好的完成上述的需求。
比如:
-当一个事件完成时(比如保存文件),需要显示一个简短的消息来确认保存成功
-假如应用正在后台运行,且需要用户注意,那么该应用需要创建一个通知以方便用户做出响应
-假如用户要操作一个危险的操作,则应该创建一个对话框通知,再一次确认用户的操作
常见的消息提示方式有:
-Logcat(日志猫)
-Toast(瞬时提示)
-Dialog(对话框)
-Notification(通知)
5.1Logcat日志猫
*级别:
v、d、i、w、e级别由低往高
-verbose:
混淆的,所有信息都可以输出,级别最低
-debug:
调试级别
-info:
信息级别
-warning:
警告级别
-error:
错误级别
*添加过滤器按照Tag进行过滤
*System.out.println()与Log输出之间的区别
-System.out.println()输出的信息等级是info级别,标记tag:
System.out
-System.out.print()输出信息需要System.out.flush()刷缓存输出
5.2Toast瞬时提示
Toast通知是一种浮现在屏幕上层的消息提醒,它只填充消息所需要的空间,而当前正在运行的活动仍然保持其自身的可见性和交互性。
这种通知自动淡入淡出且不接受交互事件
通过代码自定义Toast
*代码实现
//通过代码的形式自定义Toast
publicvoiddiyToast1(Viewv){
//声明一个Toast对象
Toasttoast=newTo