【网学网提醒】:网学会员鉴于大家对十分关注,论文会员在此为大家搜集整理了“Android学习资料”一文,供大家参考学习
环境搭建安装adt
在软件更新中添加节点dl-ssl.google/android/eclipsehttps://dl-ssl.google/android/eclipse或者
引用资源
1).Java
程序中引用:this.getResources().getString(id);获得字符串getResources().getStringArray(ID);获得String数组getResources().getDrawable(id);getResources().getColor(id);getResources().getDimension(id);R.string.hello2).XMl中引用@[package:]type/name;如@string/hello如果访问的是andriod系统中的带的文件则@android:color/red3).@+id/string_name表达式在布局文件中需要为组件设置ID属性时,使用此中格式。+表示在R.java的名为id的内部类中添加一条记录。
组件之间的引用
这是定义一个按钮
这是设置此按钮与上一按钮的位置
2.注意:
资源文件名不要以数字开头
图片名称不能包含大写字母
3.组件中获得字符串
Text=”@string/hello”
4.拨号功能
在activityJava中:
publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);Buttonb=(Button)this.findViewById(R.id.sendBtn);b.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){EditTexteditNO=(EditText)findViewById(R.id.phoneNO);EditTexteditMsg=(EditText)findViewById(R.id.msgEText);StringphoneNO=editNO.getText().toString();Stringmsg=editMsg.getText().toString();if(phoneNO!=null&;&;!"".equals(phoneNO.trim())){Intentintent=newIntent(Intent.ACTION_CALL,Uri.parse("tel:"+phoneNO));startActivity(intent);}}在AndroidManifest.xml中设置权限
5.发送短信功能
在activity中
super.onCreate(savedInstanceState);setContentView(R.layout.main);Buttonb=(Button)this.findViewById(R.id.sendBtn);b.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){EditTexteditNO=(EditText)findViewById(R.id.phoneNO);
EditText
editMsg=(EditText)findViewById(R.id.msgEText);
StringphoneNO=editNO.getText().toString();Stringmsg=editMsg.getText().toString();if(phoneNO!=null&;&;!"".equals(phoneNO.trim())){//获取默认的短信管理器smsManager=SmsManager.getDefault();//如果短信内容超过70个字符中文,将短信拆分为几条短信,以List形式逐条存放texts=smsManager.divideMessage(msg);//迭代数组,逐条发短信for(Stringtext:texts){smsManager.sendTextMessage(phoneNO,null,text,null,null);}//添加一条发送结果提示}//提示用户发送成功消息提示Toast.makeText(SendMsgActivity.this,R.string.msgSuccess,Toast.LENGTH_LONG).show();}});}配置权限
6.限制文本框内容格式文本格式内容格式
在EditText中添加android:numeric=”decimal”或android:numeric=”integer”不得
获得焦点,不能输入,不能编辑,不可用android:focusable=”false”
7布局元素宽度
线性布局
Layout_width可以包括三个值:fill_parent填满父元素,wrap_content仅包裹自身内容,具体值以px为单位orientation代表子元素排列方式:vertical垂直排列,horizontal水平排列
相对布局
Android:layout_below=”@id/test”;将该元素放到id为text的元素的下面Android:layout_toLeftOf=”@id/ok”;放到id为ok的元素的左边Android:layout_alignTop=”@id/ok”;对齐id为ok的元素的顶部
表格布局
是顶级元素定义一个行定义一个单元格的内容Android:stretchColumns=”0,1,2,3”表示每行都由第0123列占满空白空间Gravity指定文字对齐是方式,本例都为居中Padding指定视力与视力内容间的空隙,单位为像素Android:stretchColumns=”0”,当显示不开的时候,让第一列作为拉伸列
帧布局
Drawablea=getResource().getDrawable(R.drawable.a);frameLayout.setForeground(a);
9.控件
Android:gravity---指定控件的基本位置,比如居中,居右Android:textSize---指定控件中字体的大小Android:background---指定该控件所使用的背景色rbg命名法Android:padding拇控件的内边距,也就是说控件当中的内容Android:sigleLine---如果设置为真,则将控件的内容在同一行当中进行显示单行显示不能换行
RadioButton
中包含设置此组中的默认选中的单选按钮RadioGroup.check(intid);将指定的RadioButtion设置成选中状态(RadioButton)findViewById(radioGroup.getCheckedRadioButtonId());获取被选中的单选框RadioButton.getText();获取单选框的值调用setOnCheckedChangeListener()方法,处理单选框被选择事件
CheckBox
CheckBox.setChecked(true);将状态设为选中CheckBox.getText();获得多选框的值CheckBox.isChecked();判断是否被选中调用setOnCheckedChangeListener();方法处理多选框被选择事件,
ListView
可以列表的形式显示数据,至于显示什么数据以及如何显示数据,则需要Adapter类及其子类的配合.常用方法:setAdapter(ListAdapteradapter);为ListView绑定一个AdaptersetChoiceMode(intchoiceMode);指定一个显示的模式,可选三个CHOICE_MODE_NONE默认值,没有单选或多选效果CHOICE_MODE_SINGLE单选框效果CHOICE_MODE_MULTIPLE多选效果setOnItemClickListener(Adapte
rView.OnItemClickListenerlistener)为其注册一个元素被点击事件的监听器,当其中一项被点时,调用其参数listener中的onItemClick()方法
Spinner
下拉列表框Spinner.getItemAtPosition(Spinner.getSelectedItemPosition())获取下拉列表框的值调用setOnItemSelectedListener()方法,处理下拉列表框被选择事件- red
- red
- red
ProgressBar
进度条为圆形和水平进度条,水平进度条需要添加style=”?android:attr/progressBarStyleHorizontal”ProgressBar.setMax(intmax)设置总长度ProgressBar.setProgress(intprogress)设置已经开启长度为0,假设设置为50,进度条将进行到一半停止例子mProgress=(ProgressBar)findViewById(R.id.progress_bar);设定最大值,其将为该进度条显示的基数mProgress.setMax(10000(;开启一个线程NewThread(newRunnable(){//循环10000次,不停的更新值While(mProgressStatus++<10000){将一个runnable对象添加到消息队列当中并且当执行到该对象时,执行run()方法mHandler.post(newRunnabel(){publicvoidrun(){重新进度条当前的值mProgress.setProgress(mProgressStatus);}});}}).start();
SeekBar
拖动条SeekBar.getProgress();获取拖动条的当前值调用setOnSeekBarChangeListener()方法,处理拖动事件
10.系统时间
System.currentTimeMillis();
11.错误错误信息
Connectionwithadbwasinterrupted,andattemptstoreconnecthavefailed.杀掉进程中的adb.exe
12.通知
//Notification
//获得通知管理器NotificationManagernm=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);//inticon=R.drawable.icon;inticon=android.R.drawable.sym_action_email;longwhen=System.currentTimeMillis();//新建一个通知,指定图标和标题
//第一个参数为图标,第二个参数为标题,第三个为通知时间Notificationnf=newNotification(icon,null,when);//发出默认声音nf.defaults=Notification.DEFAULT_SOUND;//当点击消息时就会向系统发送openintent意图PendingIntentcontentIntent=PendingIntent.getActivity(NotificationActivity.this,0,null,0);nf.setLatestEventInfo(NotificationActivity.this,"开会通知","今天下午四点开会",contentIntent);//发送通知nm.notify(0,nf);
13.系统提供的图片系统图片系统资源
inticon=android.R.drawable.sym_action_email;
14.打开浏览器
//创建一个访问网络的意图//该意图会告诉系统打开浏览器Intentintent=newIntent(Intent.ACTION_VIEW,Uri.parse("baidu"));startActivity(intent);
15.对话框
button.setOnClickListener(new
View.OnClickListener(){
@OverridepublicvoidonClick(Viewv){AlertDialog.Builderbuilder=newAlertDialog.Builder(DialogActivity.this);builder.setTitle("提醒").setMessage("你确定要访问网络吗?").setCancelable(false).setPositiveButton("确定",newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){//创建一个访问网络的意图//该意图会告诉系统打开浏览器Intentintent=newIntent(Intent.ACTION_VIEW,Uri.parse("baidu"));startActivity(intent);}}).setNegativeButton("取消",newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){dialog.cancel();//删除对话框}});AlertDialogalert=builder.create();//创建对话框alert.show();//显示}});
16.消息提示
Toast.makeText(SendMsgActivity.this,R.string.msgSuccess,Toast.LENGTH_LONG).show();
这里SendMsgActivity.this是当前类名
17.样式CSS
在values文件夹下创建styles.xml
18px#0000CC18px#0000CC这里面的parent表示可以继承另一个样式在layout中引用 18.设置主题
在values文件夹下创建sharpTheme.xml文件
true?android:windowNoTitle
在AndroidManifest.xml中添加
19.Activity之间传递数据
activity传数据activity共享数据
1.在OneActivity中重写onActivityResult方法,
protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){//TODOAuto-generatedmethodstub//提示返回的信息super.onActivityResult(requestCode,resultCode,data);Toast.makeText(TestActivity.this,data.getStringExtra("newName"),resultCode).show();}
1.在OneActivity中启动TwoActivity
Intentintent=newIntent(TestActivity.this,TwoActivity.class);intent.putExtra("userName","bushi");//startActivity(intent);startActivityForResult(intent,1);
2.在TwoActivity中获得One传过来的数据
intent=this.getIntent();StringuserName=intent.getStringExtra("userName");
3.再向One传数据
Intentintent=newIntent();intent.putExtra("newName","aobama");TwoActivity.this.setResult(1,intent);TwoActivity.this.finish();
4.在one中获得two返回的数据在one中重写onActivityResult方法
if(resultCode==1){Stringstr=data.getStringExtra("result");System.out.println(this.getClass()+"result="+str);/
20.Service服务
1.在activity中为按钮添加
事件
开始服务:startService(newIntent("com.service.Music"));停止服务:stopService(newIntent("com.service.Music"));
2.创建一个类,继承android.app.Service;在onStart方法中执行mediaPlayer=MediaPlayer.create(this,R.raw.ibelieve);
mediaPlayer.start();
在onDestroy中执行mediaPlayer.stop();3.在AndroidManifest.xml的application中添加服务声明
21.文件操作File
FileOutputStreamfileOS=context.openFileOutput("test.txt",Context.MODE_PRIVATE);fileOS.write(content.getBytes());fileOS.close();
操作模式有:Context.MODE_PRIVATE表示文件只能被创建该文件的应用所访问。默认模式。如果文件不存在,自动创建,如果存在就会覆盖文件Context.MODE_APPEND表示模式会自动检查文件是否存在,存在就往文件追加内容,否则就创建新文件Context.MODE_WORLD_READABLE表示当前文件可以被其他应用读取Context.MODE_WORLD_WRITEABLE表示当前文件可以被其他应用写入如果希望文件被其他应用读和写,可以这样做:openFileOutput(“test.txt”,Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE)
22.调用发送短信的界面
Uriuri=Uri.parse(“smsto://0800000123”);Intentintent=newIntent(Intent.ACTION_SENDTO,uri);Intent.putExtra(“sms_body”,”TheSmStext”);startActivity(Intent);
23.对话框风格的Activity对话框
在Manifest.xml文件中修改24.使用自带的颜色默认颜色Android:background=”@android:drawable/editbox_background”
24.监听器radiobutton和checkbox
Radiobutton需要使用他的radiogroup进行分组,然radiogroup1.setOnCheckedChangeListener(newRadioGroup.OnCheckedChangeListener(){});Checkbox的监听器Checkbox1.setOnCheckedChangeListener(newCompoundButton.OnCheckedChangeListener(){});后
25.横屏显示
横屏启动
方法1:在androidmanyfest.xml的activity中加入属性android:screenOrientation="landscape"方法2:在oncreate中加入如下代码if(getRequestedOrientation()!=ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);}
26.输入法自动弹出
取消自动弹出
在activity创建时添加getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
25.例子
1.AppActivity
Animation打开Activity,里面有一个开关的组件、星星组件、下拉列表,文本框颜色不错CustomDialog使Activity显示为dialogCustomTitle修改标题可修改左边和右边的标题Dialog使用Theme.Dialog将activity看起来象对话框ForwardingActivity跳转HelloWorldPersistentState可使文件框记得原来的状态,或重
置QuickContactsDemo查看通讯录,并可调用打电话、发短信、查看详细信息ReceiveResultActivity之间传数据RedirectionActivity跳转并传数据ReorderActivities可使多个Activity之间任意跳转Save&;RestoreState可使文件框记得原来的状态,或重置ScreenOrientation可设置屏幕旋转方向、自动旋转SetWallpaper设置手机背景图片Translucent设置半透明的ActivityTranslucentBlur模糊透明Wallpaper设置手机的背景图片为当前界面的背景
Alerm
AlarmController启动射击警告启动和停止重复警告AlarmService启动和停止警告服务
DeviceAdmin设置管理员权限Dialog
各种对话框,okcancel列表对话框进度条对话框单选按钮对话框重复警告对话框发送对话、联系人对话框、接收输入对话框
Intents
打开各种intents
LauncherShortcuts
创建一个快捷键
Menu
从xml获得菜单内容,显示在下拉列表中
Notification
IncomingMessage带图片的通知框NotifyingServiceController通过服务实现通知NotifyWithText文件通知提示框消息框图标通知StatusBar通过按钮实现通知可停止通知
Preferences如系统设置中的各种选项
Preferencesfromxml从xml读取选项,各种选项切换选项父选项,子选项launchingpreferences加载另一个选项页面,并可传值,可修改值Preferencedependencies依赖选项必须选中一个,另一个才能用Defaultvalues可设置选项的默认值preferencesfromcode从代码生成选项Advancedpreferences高级选项:可点击改变值,自动修改是否选中
Search
InvokeSearch打开搜索界面
QuerySearchResults查询结果
Service
ForegroundServiceController启动停止前台和后台服务LocalServiceBinding本地服务绑定LocalServiceController启动和停止本地服务MessaengerServcie消息服务的启动和停止RemoteServiceBinding远程服务绑定,可以杀死服务,自动更新数据RemoteServiceController远程服务控制,启动和停止ServiceStartArgumentsController启动多个服务杀死线程关闭线程
Text-TO-SpeechVoiceRecognition
演示声音
Content
Assets从资源读取信息放入textviewProviderResources字体样式Storage创建文件夹,删除文件夹
Graphics
各种图像,图片AlphaBitmap画文件夹透明的色AnimateDrawables图片移动Arcs画各种弧圆BitmapDecode画能动的画,画图片,画按钮BitmapMesh点击可改变的图片BitmapPixels画渐变色CameraPreview调用摄像头Clipping剪裁图片,图形ColorFilters按钮的各种颜色ColorMatrix图片亮度发生改变Compass指南针CreateBitmap各种渐变色
Density画大小不相等的字体Drawable梯度可画渐变按钮虚线边框之类FingerPaint画形状图形各种图形Layers层MeasureText测量文本
OpenGLES
CompressedTexture旋转三角,
带图片的CubeMap圆圈立体旋转,立方体FrameBufferObject框架缓冲区对象,旋转三角形中有旋转的立方体GLSurfaceView两个立方体交互旋转Kube拼图立方体MatrixPaletteSkinning矩阵调色板剥皮左右扭腰OpenGLES2.0旋转三角,带图片SpriteText旋转三角上有字母旋转TexturedTriangle旋转三角TouchRotate触摸旋转,可以用手控制立方体旋转TranslucentGLSurfaceView在当前屏幕出现旋转立方体
PathEffects路径效果,流水线,路线条PathFillTypes路径填充类型,就是两个圆的交互Paterns方格上一层显示多个圆格,象围棋Pictures画图片Points画交互线条,点,象鱼网PolyToPoly类似信封一样的矩形中有个X号PurgeableBitmap设置是清除旧图片Regions图片交互的地区的显示方式RoundRects圆角距形,模糊边角ScaleToFit按距形比例填充圆或椭圆SensorTest画一个指针SurfaceWindow画一些类似屏保的闪动虚线SurfaceViewOverlay表面覆盖可以在其它图画之上画按钮,并响应事件,Sweep画一个旋转的,各种颜色都有的圆形TextAlign文件位置,可画波浪形文字TouchPaint触摸画,用手点击屏幕画线Typefaces文字字体UnicodeChart统一字符编码Vertices通过手指触摸图片,改变图片的顶点Xfermodes画没有背景的图形,交互
Media
AudioFx均衡器MediaPlayer播放音乐VideoView
OS
MorseCode摩尔斯Sensors传感器重力感应SMSMessaging发送消息短信
Text
Linkify带链接的文字LogTextBox可点击按钮添加多个文本内容Marquee
1ViewsAnimation
3DTransition
页面切换特效,象翻书一样Interpolators文字飞入的效果Push文字飞出的效果Shake输入内容后,文本框左右晃动
AutoComplete
ScreentTop文本框居上ScreenBottom底部
Scroll产生滚动条ContactsContactswithHintMultipleItems
Buttons
大、小、开关按钮
Chronometer
计时表,计时器
Controls
高亮主题,默认主题
Custom
风格
DateWidgets
DialogInline时间控件,显示可修改日期和时间的控件
ExpandableLists
扩展列表CustomAdapterCursor(People)通过当前联系人填充列表SimpleAdapter
Focus
Vertical竖直方向焦点
Horizontal水平方向焦点Circular四个方向的焦点InternalSelection内部焦点没反应
Gallery
画廊联系人名单横向显示
Grid
IconGrid图标表格象应用程序列表PhotoGrid图片表格显示所有图片的缩略图
ImageButton
带图片的按钮
ImageSwitcher
图片切换,图片查看,图片之间切换
ImageView
图片显示预览
LayoutAnimation
GridFade图片竖起方向一个一个显示ListCascade列表的方式从上到下显示出来ReverseOrder从下到上显示列表Randomiae图片从各个方向随机显示GridDirection图标从下到上一个个显示WaveScale图标从第一排下向一排
一排显示,从小到大NestedAnimations文件框从上到下一个个排出来
Layouts
BaseLineEveryWhere可将组件放在任何位置Multi-line多行文本框Relative相对位置例子各种排列
LinearLayoutBackgroundImage文本框右面有背景图片Vertical(Padded)竖起排列,有一个组件跑到最下面了LayoutWeight底下的按钮不动,列表可上下手动RelativeLayoutScrollView带上下滚动的窗口,如果组件显示不开,可向下拖动TableLayout
Lists
ArraySingleChoiceList单选按钮列表MultipleChoiceList复选框列表Transcript动态增加文本内容SlowAdapter缓慢加载数据EfficientAdapter快速加载数据,显示图标和标题的列表Cursor(Phones)加载联系人和电话ListAdapter加载大量数据Separators分隔符分隔线ListAdapterCollapsed收缩列表紧凑Cursor(Phones)显示联系人最下面有个标签Photos图片列表,可动态添加新的图片,删除图片Array(Overlay)列表,带悬浮文字,类似于查找联系人时显示的首字母序号
ProgressBar
水平滚动条旋转滚动条
对话框滚动条标题上显示滚动条
RadioGroup
RatingBar
评价条类似网站新闻的评价图标一样
ScrollBars
各种下列滚动条
SecureView
安全视力
SeekBar
进度条,可改变值的进度条
Spinner
下拉列表中包含单选按钮列表
tabs
类似导航栏tagbar带图标的导航栏
TextSwitcher
使用按钮改变文本内容
Visibility
使某个组件可见,显示,隐藏
WebView
显示网页的组件
@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);webview1=(WebView)findViewById(R.id.webView1);setUrlBtn=(Button)findViewById(R.id.setUrlBtn);exitBtn=(Button)findViewById(R.id.exitBtn);//实例化WebView对象//webview1=newWebView(this);//设置WebView属性,能够执行Javascript脚本webview1.getSettings().setJavaScriptEnabled(true);//加载需要显示的网页webview1.loadUrl(“baidu”);webview1.setWebViewClient(newWebViewClient(){publicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){view.loadUrl(url);returntrue;}});////设置Web视图setContentView(webview1);setUrlBtn.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent(MainActivity.this,SetUrlActivity.class);startActivity(intent);}});@Override//设置回退//覆盖Activity类的onKeyDown(intkeyCoder,KeyEventevent)方法publicbooleanonKeyDown(intkeyCode,KeyEventevent){if((keyCode==KeyEvent.KEYCODE_BACK)&;&;webview1.canGoBack()){webview1.goBack();//goBack()表示返回WebView的上一页面returntrue;}
returnfalse;}
添加权限
26.SQLite数据库
开始-运行-cmd,回车进去命令操作界面adbshell就可以输入命令进入数据库所在
目录了data-data-所在包命-ls出数据名如果显示morethanonedeviceandemulator解决:use'adbdevices'togetalistofdevicesconnectedthen'adb-sdevicenameshell'创建一个类,继承SQLiteOpenHelper在构造方法中添加创建表格的代码:db.execSQL("createtablestudent(sidint,snamevarchar(20),sageint,ssexvarchar(2))");创建数据库:
DataBaseHelperdb=newDataBaseHelper(SQLiteActivity.this,"Student_DB",1);SQLiteDatabasesqldb=db.getReadableDatabase();更新数据库DataBaseHelperdb=newDataBaseHelper(SQLiteActivity.this,"Student_DB",2);SQLiteDatabasesqldb=db.getReadableDatabase();添加记录ContentValuescv=newContentValues();cv.put("sid",1);cv.put("sname","lisi");cv.put("sage",23);cv.put("ssex","na");DataBaseHelperdb=newDataBaseHelper(SQLiteActivity.this,"Student_DB",2);SQLiteDatabasesqldb=db.getWritableDatabase();sqldb.insert("student",null,cv);删除记录DataBaseHelperdb=new
DataBaseHelper(SQLiteActivity.this,"Student_DB",2);SQLiteDatabasesqldb=db.getWritableDatabase();sqldb.delete("student","sid=?",newString[]{"1"});修改记录ContentValuescv=newContentValues();cv.put("sname","zhangsan");cv.put("sage",33);cv.put("ssex","nv");DataBaseHelperdb=newDataBaseHelper(SQLiteActivity.this,"Student_DB",2);SQLiteDatabasesqldb=db.getWritableDatabase();sqldb.update("student",cv,"sid=?",newString[]{"1"});
查询记录
DataBaseHelperdb=newDataBaseHelper(SQLiteActivity.this,"Student_DB",2);SQLiteDatabasesqldb=db.getReadableDatabase();Cursorcur=sqldb.query("student",newString[]{"sid","sname","ssex","sage"},"sid=?",newString[]{"1"},"","","");while(cur.moveToNext()){Stringsid=cur.getString(cur.getColumnIndex("sid"));Stringsname=cur.getString(cur.getColumnIndex("sname"));Stringsage=cur.getString(cur.getColumnIndex("sage"));Stringssex=cur.getString(cur.getColumnIndex("ssex"));System.out.println(sid+""+sname+""+sage+""+ssex);}
27.广播机制
创建一个类TestReceiver继承BroadcastReceiver类,重写onReceive方法在manifest.xml中配置这里表示什么操作可以接受信息
在activity类中的按钮事件中添加Intentin=newIntent();intent.setAction(Intent.ACTION_EDIT);TestReceiver.this.sendBroadcast(intent);
28.全屏显示无标题
在activity的oncreate方法中添加//设置为无标题栏requestWindowFeature(Window.FEATURE_NO_TITLE);//设置为全屏模式getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置为横屏setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);放在serContentView之前即可
29.DatePickerDialog日期控件
1.在activity中定义变量
DatePickerDialog.OnDateSetListeneronDateSetListener=newDatePickerDialog.OnDateSetListener(){@Ov
erridepublicvoidonDateSet(DatePickerview,intyear,intmonthOfYear,intdayOfMonth){Toast.makeText(CalendarActivity.this,year+""+monthOfYear+""+dayOfMonth,Toast.LENGTH_LONG).show();}};
2.重写onCreateDialog方法
@OverrideprotectedDialogonCreateDialog(intid){switch(id){case1:returnnew
DatePickerDialog(this,onDateSetListener,2011,3,20);}returnnull;}
2.
在按钮的单击事件中添加showDialog(1);
30.删除数据库
通过终端进到adbshellcddatacddatacdcom.rilicddatabases目录后使用rm文件名称回车删除就可以
31.屏幕滑动
//滑动变量
滑动效果拖动拖拽
1.创建一个activity,在里面定义变量
privateGestureDetectorgestureDetector;//滑动移动速度privatefinalintFLING_MIN_DISTANC=100;privatefinalintFLING_MIN_VELOCITY=200;
3.
在此activity中创建一个内部类classMyGestureListenerimplementsOnGestureListener{//实现onFling方法@OverridepublicbooleanonFling(MotionEvente1,MotionEvente2,floatvelocityX,floatvelocityY){System.out.println(this.getClass()+"---------->"+velocityX+""+velocityY);//触发条件//x轴的坐标位移大于fling_min_distance,且移动速度大于fling_min_velicity个像素if((e1.getX()-e2.getX())>FLING_MIN_DISTANC&;&;Math.abs(velocityX)>FLING_MIN_VELOCITY){System.out.println("------------>向左移动");
}elseif((e2.getX()-e1.getX())>FLING_MIN_DISTANC&;&;Math.abs(velocityX)>FLING_MIN_VELOCITY){System.out.println("----------->向右移动");}elseif((e2.getY()-e1.getY())>FLING_MIN_DISTANC&;&;Math.abs(velocityX)>FLING_MIN_VELOCITY){System.out.println("----------->向下移动");}elseif((e1.getY()-e2.getY())>FLING_MIN_DISTANC&;&;Math.abs(velocityX)>FLING_MIN_VELOCITY){System.out.println("----------->向上移动");}returnfalse;}}2.在activity的onCreate()方法中gridView=(GridView)findViewById(R.id.gridView1);
gridView.setOnTouchListener(this);gestureDetector=newGestureDetector(this,newMyGestureListener());
3.实现OnTouchListener接口,并实现里面的方法OnTouch();
并在里面添加:returngestureDetector.onTouchEvent(event);
32.数据存储SharedPreferencesPreferences数据存储
Shared
写数据SharedPreferenceswrite=getSharedPreferences("SheZhi",Context.MODE_PRIVATE);SharedPreferences.Editoreditor=write.edit();editor.putFloat("oilprice",Float.parseFloat(oilpriceET.getText()+""));editormit();读数据
SharedPreferencessettins=getSharedPreferences("SheZhi",Activity.MODE_PRIVATE);oilpriceET.setText(settins.getFloat("oilprice",0)+"");
33.数据存储File存储
写
Propertiesproperties=newProperties();properties.put("myname",""+edittext.getText());try{FileOutputStreamfos=MainActivity.this.openFileOutput("test.cfg",Context.MODE_WORLD_WRITEABLE);properties.store(fos,"");}catch(FileNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(IOExceptione){e.printStackTrace();}
读
Properti
esproperties=newProperties();try{FileInputStreamfis=MainActivity.this.openFileInput("test.cfg");properties.load(fis);Toast.makeText(MainActivity.this,""+properties.get("myname"),Toast.LENGTH_LONG).show();}catch(FileNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}
34.数据库操作SQLite
1.创建DataBaseHelper,继承SQLiteOpenHelper2.在onCreate方法添加创建表的语句db.execSQL("createtablestudent(snumvarchar(20),snamevarchar(20),ageint,heightfloat)");4.在你的按钮事件中添加如下代码,实现创建数据库dbh=newDataBaseHelper(MainActivity.this,"studentsys",null,1);5.在添加记录的按钮事件中添加如下代码
SQLiteDatabasedb=dbh.getWritableDatabase();ContenValuescv=newContentValues();cv.put(“name”,”bushi”);cv.put(“age”,24);db.insert(“student“,null,cv);db.close();6.删除记录SQLiteDatabasedb=dbh.getWritableDatabase();db.delete("student","snum=?",newString[]{"ht001"});db.close();7.修改记录SQLiteDatabasedb=dbh.getWritableDatabase();ContentValuescv=newContentValues();cv.put("sname","aobama");cv.put("age",52);db.update("student",cv,"snum=?",newString[]{"ht001"});db.close();8.查询记录SQLiteDatabasedb=dbh.getReadableDatabase();Cursorcursor=db.query("student",newString[]{"snum","sname","age","height"},"snum=?",newString[]{"ht001","ht002"},"","","");while(cursor.moveToNext()){Stringsnum=cursor.getString(cursor.getColumnIndex("snum"));Stringsname=cursor.getString(cursor.getColumnIndex("sname"));intage=cursor.getInt(cursor.getColumnIndex("age"));floatheight=cursor.getFloat(cursor.getColumnIndex("height"));System.out.println("snum=="+snum+"name="+sname+"age="+age+"height="+height);}
35.语音识别
事先需要安装voicesearch插件1.在布局文件中添加一个按钮(speakBtn)和一个ListView2.在Activity的onCreate()方法中分别获得这两个组件3.在onCreate()中添加如下代码
PackageManagerpm=getPackageManager();Listactivities=pm.queryIntentActivities(newIntent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH),0);if(activities.size!=0){Toast.makeText(SendMsgActivity.this,”支持语音识别”,Toast.LENGTH_LONG).show();}else{
Toast.makeText(SendMsgActivity.this,”不支持语音识别”,Toast.LENGTH_LONG).show();}5.在此activity中添加一个方法privatevoidstartVoiceRecognitionActivity(){Intentintent=newIntent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);intent.putExtra(RecognizerIntent.EXTRA_PROMPT,"Speechrecognitiondemo");startActivityForResult(intent,VOICE_RECOGNITION_REQUEST_CODE);}6.在此类中添加如下方法@OverrideprotectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){if(requestCode==VOICE_RECOGNITION_REQUEST_CODE&;&;resultCode==RESULT_OK){ArrayListmatc
hes=data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);listview.setAdapter(newArrayAdapter(this,android.R.layout.simple_list_item_1,matches));}super.onActivityResult(requestCode,resultCode,data);}
为speakBtstartVoiceRecognitionActivity();7.n按钮添加点击事件,在click方法中添加
36.GoogleMapGoogle地图
谷歌地图
测试模式下使用googleapi需要申请apikey打包时要重新申请apikey在cmd中输入如下命令keytool-list-aliaspcm-keystore"F:\OldProject\Android\PCM\pcmkeystore"这里的pcm是打包时填写的alias值后面的pcmkeystore是你打好包后keystore文件路径
37.TagHost标签
首先需要使用自定义的TabHost,布局文件main.xml如下: android:layout_height="wrap_content"android:text="@string/textView_3"/>注意事项:TabWidget的id必须是tabs,FrameLayout的id必须是tabcontent,其他的id随意,此外TabWidget使用RelativeLayout相对布局,同时TabWidget的android:layout_alignParentBottom属性设置成true(标签页头在屏幕的底部),如果此属性设置成false,则标签页头在屏幕的顶部。接下来是java代码文件:publicclassMainActivityextendsActivity{publicvoidonCreate(Bundleicicle){super.onCreate(icicle);setContentView(R.layout.main);TabHosttabs=(TabHost)findViewById(R.id.tabhost);tabs.setup();TabHost.TabSpecspec=tabs.newTabSpec("tab1");spec.setContent(R.id.tab1)
;spec.setIndicator("Alert");//如果需要带icon图标,则使用setIndicator(CharSequencelabel,Drawableicon)函数tabs.addTab(spec);spec=tabs.newTabSpec("tab2");spec.setContent(R.id.tab2);spec.setIndicator("Stock");tabs.addTab(spec);spec=tabs.newTabSpec("tab3");spec.setContent(R.id.tab3);spec.setIndicator("News");tabs.addTab(spec);setTitle("Alert");tabs.setCurrentTab(0);//启动时显示第一个标签页}}不少Android客户端都使用了TabHost控件显示UI,相同的功能放在一个标签页面上,方便用户在不同的功能组里切换,界面清晰、简洁,很容易操作。
38.Monkey测试工具
adbshellmonkey-pcn.android123.cwj-v100
39.判断service服务是否运行
pubicbooleanisServiceRun(Contextcontext){ActivityManageram=(ActivityManager)context.getSystemService(context.ACTIVITY_SERVICE);Listlist=am.getRunningServices(30);for(RunningServiceInfoinfo:list){if(info.service.getClassName.equals("service的全称(一般为包名+service类的名称)")){returntrue;}}returnfalse;}
40,播放音乐
privateSoundPoolsp;privateHashMapspMap;在create方法中初始化:sp=newSoundPool(5,AudioManager.STREAM_MUSIC,0);spMap=newHashMap();spMap.put(1,sp.load(this,R.raw.gun,1));定义一个方法,用来播放:publicvoidplaySound(intsound,intnumber){AudioManageram=(AudioManager)this.getSystemService(this.AUDIO_SERVICE);floataudioMaxVolumn=am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);floataudioCurrentVolumn=am.getStreamVolume(AudioManager.STREAM_MUSIC);floatvolumnRatio=audioCurrentVolumn/audioMaxVolumn;
sp.play(spMap.get(sound),volumnRatio,volumnRatio,1,number,1);}
用户人机界面
范例说明
前一章写了HelloWorld之后,一直觉得没有写半行代码对不起自己,所以在本章人机界面一开始,则延续HelloWolrd的气势,进行与TextView文字标签的第一次接触。在此范例中,将会在Layout中创建TextView对象,并学会定义res/values/strings.xml里的字符串常数,最后通过TextView的setText方法,在预加载程序之初,更改TextView文字。
运行结果
▲图3-1
认识TextView.setText更改默认Layout里定义的文本字符串
范例程序
src/irdc.ex03_01/EX03_01.java
主程序示范以setText方法,输出String类型的字符串变量。
packageirdc.ex03_01;importandroid.app.Activity;importandroid.os.Bundle;
/*必须引用widget.TextView才能在程序里声明TextView对象*/importandroid.widget.TextView;publicclassEX03_01extendsActivity{/*必须引用widget.TextView才能在程序里声明TextView对象*/privateTextViewmTextView01;
/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);
/*载入main.xmlLayout,此时myTextView01:text
为str_1*/setContentView(R.layout.main);
/*使用findViewBtId函数,利用ID找到该TextView对象*/mTextView01=(TextView)findViewById(R.id.myTextView01);
Stringstr_2="欢迎来到Android的TextView世界...";mTextView01.setText(str_2);}}
res/layout/main.xml
以android:id命名TextView的ID为mTextView01;在较旧的版本写法与1.0的不同,请特别留意。
扩展学习
TextView里的setText方法支持以下多态构造方法:
publicfinalvoidsetText(CharSequencetext)
publicfinalvoidsetText(intresid)publicvoidsetText(CharSequencetext,TextView.BufferTypetype)publicfinalvoidsetText(intresid,TextView.BufferTypetype)publicfinalvoidsetText(char[]text,intstart,intlen)
在此,以最后setText(char[]text,intstart,intlen)为例,第一个参数为char数组作为输出依据,第二个参数为从哪一个元素索引开始选取,第三个参数则为要取出多少个元素,请看以下的例子:
charchar_1[]=newchar[5];char_1[0]='D';char_1[1]='a';char_1[2]='v';char_1[3]='i';char_1[4]='d';mTextView01.setText(char_1,1,3);
如上述程序所示,输出的结果是“avi”,因为从第1个元素索引开始,共取3个元素;最后则要提醒你,TextView.setTextView不支持HTMLTAG的输出,所以即便写成这样:
mTextView01.setText("戴维的博客");
实际输出时,也就是纯文本而已,并不会作HTMLTAG的转换。但若撇开HTMLTAG之外(如“<”开头的标记),在TextView里加上了android:autoLink="all",那么正文中若有网址(),是可以被显示的,以下这个范例就交给你自己实现看看。
/>
范例说明
在之前的范例运行结果,窗口的底色一律是“深黑色”,这是SDK默认的颜色,要更改Activity里的窗口底色有许多方法,最简单的方法就是将颜色色码事先定义在drawable当中,当程序onCreate创建的同时,加载预先定义的画面颜色。此范例程序的设计方式是在drawable里指定Layout的背景色(BackGround)为白色,但这里的“白色”(颜色色码为#FFFFFFFF)预先定义在drawable当中,当程序运行
时,背景就会变为白色。这是指定ActivityLayout背景颜色最简单的方法,在范例最末,则将示范如何创建色彩板(colortable),让Android手机程序可以像使用“常数”般直接取用,并反应在应用程序的运行阶段。
运行结果
▲图3-2
使用drawable设置颜色常数,应用于程序运行时的结果
范例程序
src/irdc.ex03_02/EX03_02.java
程序继承自Activity类,并在重写onCreate创建之初,直接显示R.layout.mainmain.xml)(这个页面安排的布局配置。
packageirdc.ex03_02;importandroid.app.Activity;importandroid.os.Bundle;publicclassEX03_02extendsActivity{/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);}}
res/layout/main.xml
在页面布局上,使用了2个TextView对象,以及2个EditText对象,关键在于android:background="@drawable/white"让程序背景变成了白色,而android:textColor="@drawable/darkgray"将TextView里的文字颜色(textColor)设为灰色,当中“@drawable/white”及“@drawable/darkgray”的写法则是参考事先于drawable里定义好的颜色常数,将在res/values/color.xml里看见颜色的定义描述。
xmlns:android="schemas.android/apk/res/android"> android:layout_width="120dip"android:layout_height="wrap_content"android:textSize="18sp"android:layout_x="114px"android:layout_y="57px">
扩展学习
事先将定义好的颜色代码(colorcode)以drawable的名称(name)存放于resources当中,这是开发Android程序的好习惯,正如同字符串常数一样,颜色也是可以事先定义好的。在本范例中学会了使用drawable的resource的定义方法:
color_value
定义好的drawablename常数,必须存放于res/values下面,作为资源取用,
但定义好
的背景颜色并非只能当作是“默认”颜色声明使用,在程序的事件里,是可以通过程序来更改的,如以下程序所示:
Resourcesresources=getBaseContext().getResources();DrawableHippoDrawable=resources.getDrawable(R.drawable.white);TextViewtv=(TextView)findViewByID(R.id.text);tv.setBackground(HippoDrawable);
范例说明
上一个范例通过Drawable来定义颜色常数,但实际设计中最常用的方法,则是使用程序控制TextView或其它对象的背景色(setBackgroundDrawable方法),如判断对象被点击时的背景色亮起、当失去焦点时,又恢复成原来的背景色等等。以下的范例,将扩展前一个范例的实现,预先在Layout当中设计好两个TextView,并在onCreate同时,通过两种程序描述方法,实时更改原来Layout里TextView的背景色以及文字颜色,最后学会使用Android默认的颜色常数(graphics.Color)来更改文字的前景色。
运行结果
▲图3-3通过setBackgroundDrawable方法更改TextView的背景色以及graphics.Color更改前景色
范例程序
src/irdc.ex03_03/EX03_03.java
程序里新建两个类成员变量:mTextView01与mTextView02,这两个变量在onCreate之
初,以findViewById方法使之初始化为layout(main.xml)里的TextView对象。在当中使用了Resource类以及Drawable类,分别创建了resources对象以及HippoDrawable对象,并将前一个范例中所创建的R.drawable.white以getDrawable方法加载,最后则调用了setBackgroundDrawable来更改mTextView01的文字底纹。更改TextView里的文字,则使用了setText方法。在mTextView02当中,使用了graphics.Color里的颜色常数,接着,再利用setTextColor更改文字的前景色。
packageirdc.ex03_03;importandroid.app.Activity;importandroid.content.res.Resources;importandroid.graphics.Color;importandroid.graphics.drawable.Drawable;importandroid.os.Bundle;importandroid.widget.TextView;publicclassEX03_03extendsActivity{privateTextViewmTextView01;privateTextViewmTextView02;
/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);
mTextView01=(TextView)findViewById(R.id.myTextView01);mTextView01.setText("我是应用Drawable背景色的戴维文本。");
Resourcesresources=getBaseContext().getResources();DrawableHippoDrawable=resources.getDrawable(R.drawable.white);mTextView01.setBackgroundDrawable(HippoDrawable);
mTextView02=(TextView)findViewById(R.id.myTextView02);
/*下使用Color.MAGENTA指定文本的颜色为紫红色*/mTextView02.setTextColor(Color.MAGENTA);}}
扩展学习
Resourcesresources=getBaseContext().getResources();DrawableHippoDrawable=resources.getDrawable(R.drawable.white);
上述这2行
代码,在前一版本中的写法是这样的:
Resources.resources=getDrawable(R.drawable.solid_red);DrawableHippoDrawable=resources.getDrawable(R.drawable.white);
但是在1.0之后的版本,Resources不再支持直接使用.getDrawable方法直接取用drawable,而必须先取得基类的Context才行。此外,在程序里使用了Color.MAGENTA让TextView里的文字变成了粉红色,事实上,在Android里还有以下12种常见的颜色:
Color.BLACK
Color.BLUEColor.CYANColor.DKGRAYColor.GRAYColor.GREENColor.LTGRAYColor.MAGENTAColor.REDColor.TRANSPARENTColor.WHITEColor.YELLOW
这些颜色常数是定义在android.graphics.Color里的:
类型intintintintintintintintintintintint
常数BLACKBLUECYANDKGRAYGRAYGREENLTGRAYMAGENTAREDTRANSPARENTWHITEYELLOW
值-16777216-16776961-16711681-12303292-7829368-16711936-3355444-65281-655360-1-256
色码0xff0000000xff0000ff0xff00ffff0xff4444440xff8888880xff00ff000xffcccccc0xffff00ff0xffff00000x000000000xffffffff0xffffff00
范例说明
从一开始自Layout里通过Resource初始化TextView的文字,到程序中动态更改TextView文字,但要如何在代码里取得Resource的字符串呢?在Android里,确实是有些方法可以直接以R.string.*直接转换ID为String,不过,这样的数据类型转换是非常规甚至是不妥的,正确的方法是利用Context.getString方法来取得存放在global里的ResourceID。以下这个范例将示范如何在程序运行时(runtime),通过CharSequence依据ResourceID取出字符串,
并正确更改TextView的文字。
运行结果
▲图3-4通过java.lang.CharSequence这个Interface来取得存放在global里的ResourceID
范例程序
src/irdc.ex03_04/EX03_04.java
主程序的差异主要是在更改mTextView02的文字时(setText方法)合并了str_3与str_2,这两个不同对象,由于setText方法同时支持CharSequence与String类型的参数,故在此示范不同数据类型的字符串进行同步输出。
packageirdc.ex03_04;importandroid.app.Activity;importandroid.os.Bundle;importandroid.widget.TextView;publicclassEX03_04extendsActivity{privateTextViewmTextView02;
/**Calledwhentheactivityisfirstcreated.*/
@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);
mTextView02=(TextView)findViewById(R.id.myTextView02);CharSequencestr_2=getString(R.string.str_2);
Stringstr_3="我是程序里调用Resource的";mTextView02.setText(str_3+str_2);}}
res/layout/main.xml
为了作为对比,在main.xml里创建了两个TextView,并采LinearLayout的方式配置,一上一下,在运行结果中id为myTextView01的TextView并没有任何文字的更改,维持一开始的str_1(参考字符串常数里的文字)但
在程序运行后,为myTextView02的TextView,id则作了文字的实时更改。
>
扩展学习
虽然在values/strings.xml里定义了默认的字符串常数,需留意若遭遇如“?”、“'”、“\”等符号时,必须使用转义字符(\),如下:
\?\'\\
范例说明
在开发手机应用程序时,除了底层对API的掌握度之外,最重要的仍是对屏幕分辨率的概念,因各家手机厂商所采用的屏幕尺寸不同,userUI接口呈现及布局自然也各异。尽管Android可设置为随着窗口大小调整缩放比例,但即便如此,手机程序设计人员还是必须知道手机屏幕的边界,以避免缩放造成的布局(Layout)变形问题。这个范例非常的简短,只需几行程序即可取得手机的分辨率,当中的关键则是DisplayMetrics类的应用。
运行结果
▲图3-5
取得Android手机的实际屏幕分辨率
范例程序
src/irdc.ex03_05/EX03_05.java
在android.util底下的DisplayMetrics对象,记录了一些常用的信息,包含了显示信息、大小、维度、字体等等;在使用时,请记得引用android.util.DisplayMetrics。值得一提的是DisplayMetrics对象里的widthPixels及heightPixels字段为整数类型,在以下的程序当中,并没有对其作字符串类型的转换,因为字符串连接运算符的缘故,所以输出strOpt为字符串。
packageirdc.ex03_05;importandroid.app.Activity;
importandroid.os.Bundle;importandroid.util.DisplayMetrics;importandroid.widget.TextView;publicclassEX03_05extendsActivity{privateTextViewmTextView01;
/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);
/*必须引用android.util.DisplayMetrics*/DisplayMetricsdm=newDisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);
StringstrOpt="手机屏幕分辨率为:"+dm.widthPixels+"×"+dm.heightPixels;
mTextView01=(TextView)findViewById(R.i, d.myTextView01);mTextView01.setText(strOpt);}
}
扩展学习
程序一开始所创建的DisplayMetrics对象(程序中的dm),不需要传递任何参数(构造时),
但在调用getWindowManager()之后,会取得现有的Activity的Handler,此时,调用getDefaultDisplay方法将取得的宽高维度存放于DisplayMetrics对象dm中,而取得的宽高维度是以像素为单位(Pixel),“像素”所指的是“绝对像素”而非“相对像素”。
范例说明
老是要一个个指定文字的大小、颜色也不是办法,有没有类似CSS样式的方法可用来指定颜色、大小呢?事实上是有的,在Android程序开发过程中,也可以通过样式(Style)的方式,初始化TextView的文本颜色、大小;当然这个范例只是抛砖引玉,在Layout当中的任何对象(以XML定义)都可以用样式化的方式来更改其外观。在以下的范例中,将创建两个TextView作为对比,使其呈现两种不同的样式差异作为练习,而Style的写法与先前介绍到的颜色常数(color.xml)相同,同样是定义在res/values下面,但其XML定义的方式不同来看看以下这个范例练习。
运行结果
▲图3-6
利用Style来初始化TextView
范例程序
src/irdc.ex03_06/EX03_06.java
主程序看起来非常干净,只有加载R.layout.main定义布局内容而已,但由于定义在
main.xml里的语句不同,自然也有不同的样貌呈现。
packageirdc.ex03_06;importandroid.app.Activity;importandroid.os.Bundle;publicclassEX03_06extendsActivity{/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);}}
res/layout/main.xml
诚如先前所述,初始化TextView时,指定Style属性,使其应用style.xml里事先定义好的样式。
android:layout_height="fill_parent">
res/values/style.xml
在此的style.xml就是这个范例的关键之处了,当中定义了两个样式名称,分别为DavidStyleText1与DavidStyleText2;留意于
14sp#FF7F7C0.00.0
扩展学习
style与color的XML语法相类似,皆需要先声明xml的版本以及encoding为UTF-8,但其内的resources则需要以stylename作为样式名称,在最内层才是以item定义样式的范围,其语法如下:
Hexvalue|stringvalue|reference+
范例说明
按钮在许多Windows窗口应用程序中,是最常见到的控件(Controls),此控件也常在网页设计里出现,诸如网页注册窗体、应用程序里的“确定”等等。而按钮所触发的事件处理,我们称为EventHandler,只不过在Android当中,按钮事件是由系统的Button.OnClickListener所控制,熟悉Java程序设计的读者对OnXxxListener应该不陌生。以下的范例将示范如何在Activity里布局一个按钮(Button),并设计这个按钮的事
件处理函数,当点击按钮的同时,更改TextView里的文字。
运行结果
▲图3-7
Android手机的实际画面运行结果
范例程序
src/irdc.ex03_07/Ex03_07.java
一开始,必须先在Layout当中布局一个Button及一个TextView对象,找不到这两个组件的话,系统会无法运行下去,在开发阶段会造成编译错误。其次在主程序中,请留意onCreate里创建的Button.OnClickListener事件,这也是触发按钮时会运行的程序段落;但由于Eclipse无法自动加载默认的传递参数(newButton.OnClickListener()),所以,在编写程序描述时,必须自行键入新创建的按钮所需的OnClickListener()事件,如下所示:
packageirdc.ex03_07;importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;importandroid.widget.TextView;publicclassEX03_07extendsActivity
{privateButtonmButton1;privateTextViewmTextView1;
/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);
mButton1=(Button)findViewById(R.id.myButton1);mTextView1=(TextView)findViewById(R.id.myTextView1);
mButton1.setOnClickListener(newButton.OnClickListener(){@OverridepublicvoidonClick(Viewv){//TODOAuto-generatedmethodstubmTextView1.setText("Hi,Everyone!!");}});}
}
扩展学习
本范例中只有一个按钮,但在Activity里,其实可以布局数个按钮,只需要在Layout里多配置一个按钮对象,以下的程序将创建两个按钮事件作为示范:
packageirdc.ex03_07;importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;importa
ndroid.widget.TextView;publicclassEX03_07extendsActivity{privateButtonmButton1;privateButtonmButton2;privateTextViewmTextView1;
/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);
mButton1=(Button)findViewById(R.id.myButton1);mButton2=(Button)findViewById(R.id.myButton2);mTextView1=(TextView)findViewById(R.id.myTextView1);
mButton1.setOnClickListener(newButton.OnClickListener(){@OverridepublicvoidonClick(Viewv){//TODOAuto-generatedmethodstubmTextView1.setText("Hi,Everyone!!");}});
mButton2.setOnClickListener(newButton.OnClickListener(){@OverridepublicvoidonClick(Viewv){//TODOAuto-generatedmethodstubmTextView1.setText("Hi,David!!");}});}
}
最后来谈谈按钮事件里被重写的onClick(Viewv)函数,此函数唯一的参数是View类型的变量v,这个变量所指的是来自父层(parent)的ContentView,亦即通过“v.*”可以更改其父层的View状态或属性。
范例说明
在网页的世界里,想要在两个网页间做转换,只要利用超链接(HyperLink)就可以实现,但在手机的世界里,要如何实现手机页面之间的转换呢?最简单的方式就是改变Activity的Layout!在这个范例里头,将布局两个Layout,分别为Layout1(main.xml)与Layout2(mylayout.xml),默认载入的Layout为main.xml,且在Layout1当中创建一个按钮,当点击按钮时,显示第二个Layout(mylayout.xml);同样地,在Layout2里也设计一个按钮,当点击第二个Layout的按钮之后,则显示回原来的Layout1,现在就来示范如何在两个页面之间互相切换。
运行结果
▲图3-8
手机页面Layout间的切换
范例程序
src/irdc.ex03_08/EX03_08.java
主程序中,预加载的Layout是main.xml,屏幕上显示的是黑色背景的“ThisisLayout1!!”,在第一个Layout上的按钮被点击的同时,改变Activity的Layout为mylayout.xml,屏幕上显
示变为白色背景的“ThisisLayout2!!”,并利用Button点击时,调用方法的不同做两个Layout间的切换。
packageirdc.ex03_08;/*import相关class*/importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;publicclassEX03_08extendsActivity{/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);/*载入main.xmlLayout*/setContentView(R.layout.main);
/*以findViewById()取得Button对象,并添加onClickListener*/Buttonb1=(Button)findViewById(R.id.button1);b1.setOnClickListener(newButton.OnClickListener(){publicvoidonClick(Viewv){
jumpToLayout2();}});}
/*methodjumpToLayout2:将layout由main.xml切换成mylayout.xml*/publ
icvoidjumpToLayout2(){/*将layout改成mylayout.xml*/setContentView(R.layout.mylayout);
/*以findViewById()取得Button对象,并添加onClickListener*/Buttonb2=(Button)findViewById(R.id.button2);b2.setOnClickListener(newButton.OnClickListener(){publicvoidonClick(Viewv){jumpToLayout1();}});}
/*methodjumpToLayout1:将layout由mylayout.xml切换成main.xml*/publicvoidjumpToLayout1()
{/*将layout改成main.xml*/setContentView(R.layout.main);
/*以findViewById()取得Button对象,并添加onClickListener*/Buttonb1=(Button)findViewById(R.id.button1);b1.setOnClickListener(newButton.OnClickListener(){publicvoidonClick(Viewv){jumpToLayout2();}});}}
res/layout/main.xml
为了凸显Layout间切换的效果,特别改变两个Layout的背景色及输出文字。main.xml在中定义其背景色为黑色,输出文字为“ThisisLayout1!!”。
xmlns:android="schemas.android/apk/res/android">
res/layout/mylayout.xml
在mylayout.xml中定义其背景色为白色,输出文字为“ThisisLayout2!!”。
android:layout_height="wrap_content"android:layout_x="100px"android:layout_y="82px"android:text="GotoLayout1">
扩展学习
运用改变ActivityLayout这个技巧,就可做出手机页面转换的效果,当然亦可搭配之前介绍过的Style与Theme的设置,进行更加灵活的布局配置运用,例如,让用户自行决定要使用的系统样式、背景及文字颜色等,接着直接应用来改变布局。再者,利用setContentView来置换页面,还有一个特别的优点,即所有程序里的变量皆存在相同的状态,无论是类成员变量、类函数等等,皆可以在一个Activity的状态中直接取得,并没有参数传递的问题。打个比喻
:Layout1收集了用户输入的信用卡卡号等付款信息,在“下一步”显示Layout2使之显示订单信息,让用户进行确认,并在点击按钮后,调用Layout3进行刷卡Gateway的授权操作,这当中皆没有需要传递的变量,其手法是将所需要的字段数据,以类成员变量作如下声明:
publicclassEX03_08extendsActivity{publicStringcolVar1;publicStringcolVar2;publicStringcolVar3;/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){
/*下面的程序略*/
范例说明
前一个范例介绍了如何运用切换Layout的方式,进行手机页面间的转换。如果要转换的页面并不单只是背景、颜色或文字内容的不同,而是Activity的置换,那就不是单单改变Layout就能完成的,其是需要传递的变量不像网页可以通过Cookie或Session,尤在程序里要移交主控权到另外一个Activity,光靠先前的Layout技巧是办不到的。那要如何解决Activity控制权的移交呢?在Android的程序设计中,可在主程序里使用startActivity()这个方法来调用另一个Activity(主程序本身即是一个Activity)但当中的关键,并不在startActivity这个方法,而是Intent这个特有的对象,Intent就如同其英文字义,是“想要”或“意图”之意,在主Activity当中,告诉程序自己是什么,并想要前往哪里,这就是Intent对象所处理的事了。本范例并没有特别的Layout布局,而是直接在主Activity(Activity1)当中部署一个按钮,当点击按钮的同时,告诉主Activity前往Activity2,并在Activity2里创建一个回到Activity1的按钮,本范例将利用此简易的程序描述,示范如何在一个Activity中调用另一个Activity的手法。
运行结果
▲图3-9
在两个Activity间做切换
范例程序
src/irdc.ex03_09/EX03_09.java
主程序中加载的Layout为main.xml,屏幕上显示的是黑色背景的“ThisisActivity1!!”,
在Button被点击时调用另一个Activity(EX03_09_1,参考AndroidManifest.xml里的说明),并将主Activity关闭finish(),接着将主控权交给下一个Activity,即Activity2。
packageirdc.ex03_09;/*import相关class*/importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;importandroid.content.Intent;publicclassEX03_09extendsActivity{/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);/*载入main.xmlLayout*/setContentView(R.layout.main);
/*以findViewById()取得Button对象,并添加onClickListener*/Buttonb1=(Button)findViewById(R.id.button1);b1.setOnClickListener(newButton.OnClickListener(){publicvoidonClick(Viewv)
{/*new一个Intent对象,并指定要启动的class*/Intentintent=newIntent();intent.setClass(EX03_09.this,EX03_09_1.class);
/*调用一个新的Activity*/startActivity(intent);/*关闭原本的Activity*/EX03_09.this.finish();}});}}
src/irdc.ex03_09/EX03_09_1.java
EX03_09_1.java程序是第二个Activity的主程序,其加载的Layout为mylayout.xml,屏幕上所显示的是白色背景的“ThisisActivity2!!”,当主Activity(Activity1)调用这个Activity(Activity2)同样为Button添加onClickListener(),Button被点击时,后,使重新调用Activity1(EX03_09),并将Activity2(EX03_09_1)关闭(finish())。
packageirdc.ex03_09;/*import相关class*/importandroid.app.Activity;importandroid.os.Bundle;importandroid.content.Intent;importandroid.view.View;
importandroid.widget.Button;publicclassEX03_09_1extendsActivity{/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);/*载入mylayout.xmlLayout*/setContentView(R.layout.mylayout);
/*以findViewById()取得Button对象,并添加onClickListener*/Buttonb2=(Button)findViewById(R.id.button2);b2.setOnClickListener(newButton.OnClickListener(){publicvoidonClick(Viewv){/*new一个Intent对象,并指定要启动的class*/Intentintent=newIntent();intent.setClass(EX03_09_1.this,EX03_09.class);
/*调用一个新的Activity*/startActivity(intent);/*关闭原本的Activity*/
EX03_09_1.this.finish();}});
}}
res/layout/main.xml
为了凸显Activity间切换的效果,特别将两个Layout的背景及输出文字有所区别。在main.xml中定义其背景色为黑色,输出文字为“ThisisActivity1!!”。
android:text="@string/act1">
res/layout/mylayout.xml
在mylayout.xml中定义其背景色为白色,输出文字为“ThisisActivity2!!”。
android:id="@+id/text2"android:textSize="24sp"android:layout_width="186px"android:layout_height="29px"android:layout_x="70px"android:layout_y="32px"and
roid:textColor="@drawable/black"android:text="@string/act2">
AndroidManifest.xml
由于本范例中添加了一个Activity,所以必须在AndroidManifest.xml中定义一个新的activity,并给予名称name,否则程序将无法编译运行。
扩展学习
当系统中新添加Activity时,必须在AndroidManifest.xml里定义一个新的activity:
否则系统将会因为找不到Activity而发生编译错误。另外,当程序中出现两个以上的Activity时,系统要如何决定主程序是哪一支(entrypoint)呢?以本范例来说,AndroidManifest.xml中ActivityEX03_09的定义如下:
其中有一行为,这就代表程序启动时,会先运行EX03_09这个Activity,而非EX03_09_1。需注意的是,这个参数必须要被定义,如果xml中没有一支Activity有设置这个参数,则程序将不会被运行。此外,在两支Java程序中的最后一行都调用了finish()这个方法,它代表这个Activity已运作完毕,当系统接收到这个命令时,即会关闭此Activity,所以此时点击模拟器的返回(Back)键,并不会回到上一个Activity的画面,如果要让模拟器的返回键有回上一页的效果,可以将此行程序注释掉。同理,当两个Activity在切换时,并非真的只有两个Activity在切换,而是在点击按钮时,再重新调用起一个新的Activity。
范例说明
在上一个范例里,介绍了如何在Activity中调用另一个Activity,但若需要在调用另外一个Activity的同时传递数据,那么就需要利用android.os.Bundle对象封装数据的能力,将欲传递的数据或参数,通过Bundle来传递不同Intent之间的数据。本范例的设计为一个简易表单的范例,在Activity1中收集User输入的数据,在离
开Activity1的同时,将User选择的结果传递至下一个Activity2,以一个简单BMI“标准体重计算器”示范如何传递数据到下一个Activity里。
运行结果
▲图3-10
在两个Activity间做数据的传递
范例程序
src/irdc.ex03_10/EX03_10.java
在第一个Activity1主程序中,定义了“性别”选项的RadioGroup以及输入身高的“EditText”,并运用Intent及Bundle对象,在调用Activity2(EX03_10_1)时,同时将数据传入。关于EditText对象的使用在此仅供参考,详细的应用以及属性方法,将会在未来讨论控件时,再详细解说。
packageirdc.ex03_10;/*import相关class*/importandroid.app.Activity;importandroid.content.Intent;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.RadioButton;publicclassEX03_10extendsActivity
{/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);/*载入main.xmlLayout*/setContentView(R.layout.main);
/*以findViewById()取得Button对象,并添加onClickListener*/Buttonb1=(Button)findViewById(R.id.button1);b1.setOnClickListener(newButton.OnClickListener(){publicvoidonClick(Viewv){/*取得输入的身高*/EditTextet=(EditText)findViewById(R.id.height);doubleheight=Double.parseDouble(et.getText().toString());/*取得选择的性别*/Stringsex="";RadioButtonrb1=(RadioButton)findViewById(R.id.sex1);if(rb1.isChecked()){sex="M";
}else{sex="F";}/*new一个Intent对象,并指定class*/Intentintent=newIntent();intent.setClass(EX03_10.this,EX03_10_1.class);
/*new一个Bundle对象,并将要传递的数据传入*/Bundlebundle=newBundle();bundle.putDouble("height",height);bundle.putString("sex",sex);
/*将Bundle对象assign给Intent*/intent.putExtras(bundle);
/*调用ActivityEX03_10_1*/startActivity(intent);}});}}
src/irdc.ex03_10/EX03_10_1.java
那么,Activity2在(EX03_10_1)要如何接收来自Activity1(EX03_10)传递来的数据呢?试想,Activity1是以Bundle封装对象,在自然在Activity2亦是以Bundle的方式解开封装的数据;程序中以getIntent().getExtras()方法取得随着Bundle对象传递过来的性别与身高,经过计算之后,显示在屏幕上。
packageirdc.ex03_10;/*import相关class*/importjava.text.DecimalFormat;importjava.text.NumberFormat;importandroid.app.Activity;importandroid.os.Bundle;importandroid.widget.TextView;publicclassEX03_10_1extendsActivity{/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);/*加载main.xmlLayout*/setContentView(R.layout.myalyout);
/*取得Intent中的Bundle对象*/Bundlebunde=th
is.getIntent().getExtras();
/*取得Bundle对象中的数据*/Stringsex=bunde.getString("sex");doubleheight=bunde.getDouble("height");
/*判断性别*/StringsexText="";if(sex.equals("M")){sexText="男性";}else{sexText="女性";}
/*取得标准体重*/Stringweight=this.getWeight(sex,height);
/*设置输出文字*/TextViewtv1=(TextView)findViewById(R.id.text1);tv1.setText("你是一位"+sexText+"\n你的身高是"+height+"厘米\n你的标准体重是"+weight+"公斤");}
/*四舍五入的method*/privateStringformat(doublenum){NumberFormatformatter=newDecimalFormat("0.00");Strings=formatter.format(num);returns;}/*以findViewById()取得Button对象,并添加onClickListener*/privateStringgetWeight(Stringsex,doubleheight){Stringweight="";if(sex.equals("M")){weight=format((height-80)*0.7);}else{weight=format((height-70)*0.6);}returnweight;}}
res/layout/mylayout.xml
mylayout.xml为(EX03_10_1)的Layout,定义了显示计算结果的TextView。
AndroidManifest.xml
由于本范例中有两个Activity,所以文件中必须有两个activity的声明,否则系统将无法运行,请看以下的描述。
xmlns:android="schemas.android/apk/res/android"package="irdc.ex03_10"android:versionCode="1"android:versionName="1.0.0">
扩展学习
Bundle对象针对了不同的数据类型提供了许多的方法,例如,此范例中传递String类型的数据,使用的方法为Bundle.putString(stringName,stringValue):
bundle.putDouble("sex",sex);
而要传递Double类型的数Bundle.putDouble(doubleName,doubleValue),如下:据,使用的方法为
bundle.putString("height",height);
反之,若要由Bundle对象中取出数据,则使用Bundle.getString(stringName)、Bundle.getDouble(doubleName)等相对应的方法即可。除了上述简单的传递类型之外,尚有String[]与ArrayList等封装的方式可供使用参考。
范例说明
上一个范例中,好不容易将数据从Activity1传递至Activity2,如果要再回到Activity1,数据
该不会要再封装一次吧?而且前一个Activity1早就被程序destroy了,倘若在Activity1最后以finish()结束程序,再通过Activity2将数据采用Bundle的方式通过新打开Activity1传递参数,这样的做法虽然也可以恢复User输入的数据,但是并不符合我们的期待,尤其是User曾经输入过的数据,如果不小心点击回到上一页,数据就消失不见,这就不妙了。有鉴于科技始终来自于人性,如果要在次页面加上一个“回上页”的按钮,而非通过模拟器的回复键,且回上页后又能保留之前输入的相关信息,那么就必须使用startActivityForResult()来唤起一个Activity。利用这个方法,前一个Activity1便会有一个等待次Activity2的返回,而返回的数据就可以达到我们想要的结果。
运行结果
图3-11
将数据返回到前一个Activity
范例程序
src/irdc.ex03_11/EX03_11.java
在Activity1主程序中调用Activity的方法更改成startActivityForResult(intent,0),其中0为下一个Activity要返回值的依据,可指定为自行定义的参考标识符(Identifier)。程序覆盖了onActivityResult()这个方法,令程序在收到result后,再重新加载写回原本输入的值。
packageirdc.ex03_11;/*import相关class*/importandroid.app.Activity;importandroid.content.Intent;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.RadioButton;publicclassEX03_11extendsActivity{privateEditTextet;privateRadioButtonrb1;privateRadioButtonrb2;
/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState)
{super.onCreate(savedInstanceState);/*载入main.xmlLayout*/setContentView(R.layout.main);
/*以findViewById()取得Button对象,并添加onClickListener*/Buttonb1=(Button)findViewById(R.id.button1);b1.setOnClickListener(newButton.OnClickListener(){publicvoidonClick(Viewv){/*取得输入的身高*/et=(EditText)findViewById(R.id.height);doubleheight=Double.parseDouble(et.getText().toString());/*取得选择的性别*/Stringsex="";rb1=(RadioButton)findViewById(R.id.sex1);rb2=(RadioButton)findViewById(R.id.sex2);if(rb1.isChecked()){sex="M";}else{
sex="F";}
/*new一个Intent对象,并指定class*/Intentintent=newIntent();intent.setClass(EX03_11.this,EX03_11_1.class);
/*new一个Bundle对象,并将要传递的数据传入*/Bundlebundle=newBundle();bundle.putDouble("height",height);bundle.putString("sex",sex);
/*将Bundle对象assign给Intent*/intent.putExtras(bundle);
/*调用ActivityEX03_11_1*/startActivityForResult(intent,0);}});}
/*覆盖onActivityResult()*/@OverrideprotectedvoidonActivityResult(intrequestCode,intresultCode,
Intentdata){switch(resultCode){caseRESULT_OK:
/*取得来自Activity2的数据,并显示于画面上*/Bundlebunde=data.getExtras();Stringsex=bunde.getString("sex");doubleheight=bunde.getDouble("height");
et.setText(""+height);if(sex.equals("M")){rb1.setChecked(true);}else{rb2.setChecked(true);}break;default:break;}}
}
src/irdc.ex03_11/EX03_11_1.java
在Activity2的主程序中,设计当Button被点击时,将Bundle对象与结果返回给前一个Activity1。
packageirdc.ex03_11;/*import相关class*/importjava.text.DecimalFormat;importjava.text.NumberFormat;importandroid.app.Activity;importandroid.content.Intent;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;importandroid.widget.TextView;publicclassEX03_11_1extendsActivity{Bundlebunde;Intentintent;/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);
/*载入mylayout.xmlLayout*/setContentView(R.layout.myalyout);
/*取得Intent中的Bundle对象*/intent=this.getIntent();bunde=intent.getExtras();
/*取得Bundle对象中的数据*/Stringsex=bunde.getString("sex");doubleheight=bunde.getDouble("height");
/*判断性别*/StringsexText="";if(sex.equals("M")){sexText="男性";}else{sexText="女性";}
/*取得标准体重*/Stringweight=this.getWeight(sex,height);
/*设置输出文字*/TextViewtv1=(TextView)findViewById(R.id.text1);tv1.setText("你是一位"+sexText+"\n你的身高是"+height+"厘米\n你的标准体重是"+weight+"公斤");
/*以findViewById()取得Button对象,并添加onClickListener*/Buttonb1=(Button)findViewById(R.id.button1);b1.setOnClickListener(newButton.OnClickListener(){publicvoidonClick(Viewv){/*返回result回上一个activity*/EX03_11_1.this.setResult(RESULT_OK,intent);
/*结束这个activity*/EX03_11_1.this.finish();}});}
/*四舍五入的method*/privateStringformat(doublenum){
NumberFormatformatter=newDecimalFormat("0.00");Strings=formatter.format(num);returns;}/*以findViewById()取得Button对象,并添加onClickListener*/privateStringgetWeight(Stringsex,doubleheight){Stringweight="";if(sex.equals("M")){weight=format((height-80)*0.7);}else{weight=format((height-70)*0.6);}returnweight;}}
res/layout/mylayout.xml
mylayout.xml为Activity2(EX03_11_1)的Layout,其中定义了显示计算结果的TextView与回上一页的Button按钮。
00px" android:layout_y="180px" android:layout_x="110px">
AndroidManifest.xml
范例中有两个Activity,所以AndroidManifest.xml里必须有这两个activity的声明,否则系统将无法运行。
扩展学习
范例中为了在回到上一页时,能够显示之前所输入的数据,故将原本传递次Activity的Intent(里面包含了有数据的Bundle对象)再重新返回给主Activity1。如果要在次Activity2中返回其它的数据,例如,经过计算后的结果、数据,此时只需将要返回的数据再放入Bundle对象中即可达成。此外,以本范例而言,其实使用startActivity()也可达成同样的结果,仅需在主Activity被create时去判断Intent内有没有数据,有的话,就将数据带入;没有的话,就带入空值(null)。但程序还需要再做有无值的比较,较为繁琐,既然AndroidAPI中有提供更好用的方法,何来不用的道理?更何况如果系统不是只有几行代码,而是几十行、几百行代码,那时头可就大了!
史上超豪华的手机控件
范例说明
EditTextWidget的设计是为了等待User输入而准备的,那么在User输入的同时,又该如何拦截所输入的文字呢?Android的多数Widget都有setOnKeyListener事件,以此Listener捕捉User输入的键盘事件。接着,本范例将以EditText与TextView示范如何在捕捉User键盘输入文字的同时,实时取得文字,同步显示于TextView,类似手机版的Ajax效果,实时输入实时输出。
运行结果
▲图4-1
在EditText输入的数据,立即出现在TextView里面
范例程序
src/irdc.ex04_01/EX04_01.java
主程序中唯一也是关键之处,便是利用EditText.OnKeyListener来拦截EditText的键盘输入事件,仅需在其中重写onKey()方法,在onKey()方法中,将EditText.getText()取出的文字,显示于TextView当中,是一个简单易懂的范例练习。
packageirdc.ex04_01;importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.KeyEvent;importandroid.view.View;importandroid.widget.EditText;importandroid.widget.TextView;publicclassEX04_01extendsActivity{/*声明TextView、EditText对象*/privateTextViewmTextView01;priva
teEditTextmEditText01;
/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/*取得TextView、EditText*/mTextView01=(TextView)findViewById(R.id.myTextView);mEditText01=(EditText)findViewById(R.id.myEditText);
/*设置EditText用OnKeyListener事件来启动*/mEditText01.setOnKeyListener(newEditText.OnKeyListener(){@OverridepublicbooleanonKey(Viewarg0,intarg1,KeyEventarg2){//TODOAuto-generatedmethodstub/*设置TextView显示EditText所输入的内容*/mTextView01.setText(mEditText01.getText());returnfalse;}});}}
延伸学习
这个实时输入实时显示的效果可以扩展在许多手机应用程序中,可以试着在OnKeyListener()里做实时文字过滤效果,例如:当User输入不雅的文字时,可以提示User不接受部分关键字,以输入Shit为例,在TextView就会出现:Sh*t,此种做法可以过滤掉
不雅文字的出现。此外,不仅是Widget才有setOnKeyListener方法可以重写,事实上,在View里也有View.setOnKeyListener,也就是捕捉User点击键盘时的事件处理,但请特别注意,需拦截这个事件,即View要取得焦点(Focus)才能触发onKeyDown事件。最后提醒你,旧版本当中的View.setKeyListener类已经被删除,1.0r2版之后,已经改用View.setOnKeyListener()方法替换。
范例说明
延续前一章按钮事件的应用范例,重新设计一个具有背景图的按钮,让按钮有美观的背景图片,只是这次不使用先前的ButtonWidget,而是改以ImageButtonWidget来显示。将按钮背景图预先Import至Drawable里(*.png图形文件),利用这些图片,作为ImageButton的背景图,为了做对照,在Layout配置一个“一般按钮”,运行结果画面中,可以明显看出图片按钮与一般按钮在外观上的差异。要设置ImageButton背景图有许多方法,此程序使用的方法是ImageButton.setImageResource(),需要传递的参数即是res/drawable/下面的ResourceID,除了设置背景图片的方法外,程序需要用到onFocusChange与onClick等按钮事件作为按钮事件点击之后的处理,最后通过TextView来显示目前图片按钮的状态为onClick、onFocus,或offFocus,并且同步更新按钮的背景图,让User有动态交互的感觉。
运行结果
▲图4-2随着Focus与Click按钮的状态
动作,画面上的图片与文字会告知你目前图片
范例程序
src/irdc.ex04_02/EX04_02.java
主程序构造三个对象ImageButton、Button与TextView,并在ImageButton上设置onFocusChangeListener与onClickListener,并实现ImageButton图片的置换。ImageButton.setOnFocusChangeListener()是处理User点击图片按钮之后需要处理的关键,当点击
图片按钮的瞬间,以ImageButton.setImageResource()来更换背景图片。
packageirdc.EX04_02;importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.View;/*使用OnClickListener与OnFocusChangeListener来区分按钮的状态*/importandroid.view.View.OnClickListener;importandroid.view.View.OnFocusChangeListener;importandroid.widget.Button;importandroid.widget.ImageButton;importandroid.widget.TextView;publicclassEX04_02extendsActivity{/*声明三个对象变量(图片按钮,按钮,与TextView)*/privateImageButtonmImageButton1;privateButtonmButton1;privateTextViewmTextView1;
/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);
/*通过findViewById构造三个对象*/mImageButton1=(ImageButton)findViewById(R.id.myImageButton1);mButton1=(Button)findViewById(R.id.myButton1);mTextView1=(TextView)findViewById(R.id.myTextView1);
/*通过OnFocusChangeListener来响应ImageButton的onFous事件*/mImageButton1.setOnFocusChangeListener(newOnFocusChangeListener(){publicvoidonFocusChange(Viewarg0,booleanisFocused){//TODOAuto-generatedmethodstub
/*若ImageButton状态为onFocus改变ImageButton的图片*并改变textView的文字*/if(isFocused==true)
{mTextView1.setText("图片按钮状态为:GotFocus");mImageButton1.setImageResource(R.drawable.iconfull);}/*若ImageButton状态为offFocus改变ImageButton的图片*并改变textView的文字*/else{mTextView1.setText("图片按钮状态为:LostFocus");mImageButton1.setImageResource(R.drawable.iconempty);}}});
/*通过onClickListener来响应ImageButton的onClick事件*/mImageButton1.setOnClickListener(newOnClickListener(){publicvoidonClick(Viewv){//TODOAuto-generatedmethodstub/*若ImageButton状态为onClick改变ImageButton的图片*并改变textView的文字*/mTextView1.setText("图片按钮状态为:GotClick");mImageButton1.setImageResource(R.drawable.iconfull);
}});
/*通过onClickListener来响应Button的onClick事件*/mButton1.setOnClickListener(newOnClickListener(){publicvoidonClick(Viewv){//TODOAuto-generatedmethodstub/*若Button状态为onClick改变ImageButton的图片*并改变textView的文字*/mTextView1.setText("图片按钮状态为:LostFocus");mImageButton1.setImageResource(R.drawable.iconempty);}});}}
扩展学习
除了在运行时用onFocus()与onClick()事件来设置按钮背景图片外,Android的MVC设计理念,可以让程序运行之初就以xml定义的方式来初始化ImageButton的背景图,仅需先将图片导入res/drawable。设置方法为在res/drawable下自行定义一个xml,主要针对按钮的state_focused、state_pressed与drawable属性作设置,如下所示:
drawable/advancedbutton.xml
0"encoding="utf-8"?>
然后,在main.xml中将advancedbutton赋值给Button组件中background的属性。
layout/main.xml
android:background="@drawable/advancedbutton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/str_button1"/>
如此一来,即可达到如同本范例程序所展示的效果。
范例说明
Toast是Android专属的提示小对象,它的使用方式相当简单,但用途却很广泛,基本上,Toast就是一个简短的小信息,将要告诉用户的信息,以一个浮动在最上层的View显示,显示Toast之后,静待几秒后便会自动消失,最常见的应用就是音量大小的调整,当点击音量调整钮之后,会看见跳出的音量指示Toast对象,等待调整完之后便会消失。通过Toast的特性,可以在不影响用户通话或聆听音乐情况下,显示要给User的信息。对于程序员来说,它也是一个非常好用的debug工具,可以在任何程序运行时,通过Toast的方式,显示运行变量或手机环境的概况。本范例使用一个EditText控件来接受用户输入的文字,以及配置Button按钮Widget,点击按钮时,将EditText里的文字,以Toast.makeText()的方法让文字显示于Toast对象中,这段文字会在显示一段时间后自动消失,读者可借此体验一下Toast对象的使用与显示。
运行结果
▲图4-3
在EditText字段中填写文字,点击按钮送出后,会发出Toast信息
范例程序
src/irdc.ex04_03/EX04_03.java
主程序需要构建两个控件EditText与Button,Button的onClick()方法中使用Toast对在象的makeText()方法来显示输入的文字。
packageirdc.EX04_03;importandroid.app.Activity;importandroid.os.Bundle;importandroid.text.Editable;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.Toast;publicclassEX04_03extendsActivity
{/**Calledwhentheactivityisfirstcreated.*//*声明两个对象变量(按钮与编辑文字)*/privateButtonmButton;privateEditTextmEditText;
@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);
/*通过findViewById()取得对象*/mButton=(Button)findViewById(R.id.myButton);mEditText=(EditText)findViewById(R.id.myEditText);
/*
设置onClickListener给Button对象聆听onClick事件*/mButton.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){//TODOAuto-generatedmethodstub
/*声明字符串变量并取得用户输入的EditText字符串*/EditableStr;Str=mEditText.getText();
/*使用系统标准的makeText()方式来产生Toast信息*/Toast.makeText(EX04_03.this,"你的愿望"+Str.toString()+"已送达耶诞老人信箱",
Toast.LENGTH_LONG).show();
/*清空EditText*/mEditText.setText("");}});}}
扩展学习
Toast显示后会在一定时间内消失,Toast构造参数中的第二个参数为显示的时间常数,在可设置为LENGTH_LONG或LENGTH_SHORT,前者提示时间较长,后者较短,作为传递makeText()方法的参数使用。当然,你也可以使用重写Toast对象的方法,自定义Toast显示的Layout,以不同于系统内置的方式显示客制化的Toast对象,如要在Toast里显示图片(Drawable),方式如下:
ToastmToast01=newToast(this);ImageViewmView01=newImageView(this);
mView01.setImageResource(R.drawable.icon);mToast01.setView(mView01);mToast01.show();
或显示自定义的LayoutWidget(如TextView),则写法如下:
ToastmToast01=newToast(this);TextViewmView01=newTextView(this);mView01.setText("ToastWords");mToast01.setView(mView01);mToast01.show();
或者通过AlertDialog.Builder来创建类似Toast的信息对象,读者可以实现看看,比较两者有何不同:
AlertDialogmADialog01=newAlertDialog.Builder(this)mADialog01.setTitle("Android提示");mADialog01.setMessage("thisisamessage");mADialog01.show();
范例说明
所有的网络服务在User使用之前,都需要签署同意条款,在手机应用程序、手机游戏的设计经验中,常看见CheckBox在同意条款情境的使用,其选取的状态有两种isChecked=true与isChecked=false。以下范例将设计一个TextView放入条款文字,在下方配置一个CheckBoxWidget作为选取项,通过Button.onClickListener按钮事件处理,取得User同意条款的状态。当CheckBox.isChecked为true,更改TextView的文字内容为“你已接受同意!!”,当未选取CheckBox时,Button是不可以选择的(被Disabled)。
运行结果
▲图4-4
未勾选“我同意”时,“确定”按钮是不可以按的
范例程序
src/irdc.ex04_04/EX04_04.java
利用CheckBox.OnClickListener里的事件来判断Button该不该显示,其方法就是判断Button.Enabled的值;在一开始时,默认参数为false,当有点击CheckBox时,Button参数就修改为true。
packageirdc.ex04_04;importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;importandroid.widget.CheckBox;importandroid.widget.TextView;publicclassEX04_04extendsActivity
{/**Calledwhentheactivityisfir
stcreated.*/
/*声明TextView、CheckBox、Button对象*/publicTextViewmyTextView1;publicTextViewmyTextView2;publicCheckBoxmyCheckBox;publicButtonmyButton;
@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);
/*取得TextView、CheckBox、Button*/myTextView1=(TextView)findViewById(R.id.myTextView1);myTextView2=(TextView)findViewById(R.id.myTextView2);myCheckBox=(CheckBox)findViewById(R.id.myCheckBox);myButton=(Button)findViewById(R.id.myButton);
/*将CheckBox、Button默认为未选择状态*/myCheckBox.setChecked(false);myButton.setEnabled(false);
myCheckBox.setOnClickListener(newCheckBox.OnClickListener(){@OverridepublicvoidonClick(Viewv){//TODOAuto-generatedmethodstubif(myCheckBox.isChecked()){/*设置Button为不能选择对象*/myButton.setEnabled(true);myTextView2.setText("");}else{/*设置Button为可以选择对象*/myButton.setEnabled(false);myTextView1.setText(R.string.text1);/*在TextView2里显示出"请勾选我同意"*/myTextView2.setText(R.string.no);}}});
myButton.setOnClickListener(newButton.OnClickListener(){@OverridepublicvoidonClick(Viewv){//TODOAuto-generatedmethodstubif(myCheckBox.isChecked()){myTextView1.setText(R.string.ok);}else{}}});
}}
扩展学习
CheckBox在默认内容为空白时(没有任何默认的提示文字下),可设置提示User的文字,其调用的方法为CheckBox.setHint()方法;在扩展学习的范例练习,是抓取R.string.hello这个字符串常数,其与默认CheckBox文字的结果是相同的,试试看:
myTextView1=(TextView)findViewById(R.id.myTextView1);myTextView2=(TextView)findViewById(R.id.myTextView2);myCheckBox=(CheckBox)findViewById(R.id.myCheckBox);
myButton=(Button)findViewById(R.id.myButton);myCheckBox.setChecked(false);/*利用setHIT抓取strings里面的值*/CharSequencehint=getString(R.string.hello);myCheckBox.setHint(hint);/*设置文字颜色*/myCheckBox.setHintTextColor(Color.RED);
范例说明
你使用消费券了吗?消费券只有3600元,但是想要买的东西却是无穷多(∞)。这个范例程序要示范的是CheckBox.setOnCheckedChangeListener,在程序中设计三个CheckBox核取项,分别表示三种物品列表,当User勾选其中一个物品,就在TextView里显示已选择的物品列表。程序的关键在同时聆听三个CheckBox.OnCheckedChangeListener的状态,并在CheckBox.onChecked()方法中,重组所有被勾选的物品文字。
运行结果
▲图4-5
勾选不同的CheckBox,CheckBox的文字会在TextView中显示出来该
范例程序
src/irdc.ex04_05/EX04_05.java
主程序的重点在于构造三个CheckBox的对象,以及一个TextView对象,并通过setOnCheckedChangeListener实现onCheckedChanged()方法来更新TextView文字。
packageirdc.EX04_05;importandroid.app.Activity;importandroid.os.Bundle;importandroid.widget.CheckBox;importandroid.widget.CompoundButton;importandroid.widget.TextView;publicclassEX04_05extendsActivity{/*声明对象变量*/privateTextViewmTextView1;privateCheckBoxmCheckBox1;privateCheckBoxmCheckBox2;privateCheckBoxmCheckBox3;
/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/*通过findViewById取得TextView对象并调整文字内容*/mTextView1=(TextView)findViewById(R.id.myTextView1);mTextView1.setText("你所选择的项目有:");
/*通过findViewById取得三个CheckBox对象*/mCheckBox1=(CheckBox)findViewById(R.id.myCheckBox1);mCheckBox2=(CheckBox)findViewById(R.id.myCheckBox2);mCheckBox3=(CheckBox)findViewById(R.id.myCheckBox3);
/*设置OnCheckedChangeListener给三个CheckBox对象*/mCheckBox1.setOnCheckedChangeListener(mCheckBoxChanged);mCheckBox2.setOnCheckedChangeListener(mCheckBoxChanged);mCheckBox3.setOnCheckedChangeListener(mCheckBoxChanged);}
/*声明并构造onCheckedChangeListener对象*/privateCheckBox.OnCheckedChangeListenermCheckBoxChanged=newCheckBox.OnCheckedChangeListener(){/*implementonCheckedChanged方法*/@OverridepublicvoidonCheckedChanged(CompoundButtonbuttonView,
booleanisChecked){//TODOAuto-generatedmethodstub/*通过getString()取得CheckBox的文字字符串*/Stringstr0="所选的项目为:";Stringstr1=getString(R.string.str_checkbox1);Stringstr2=getString(R.string.str_checkbox2);Stringstr3=getString(R.string.str_checkbox3);Stringplus=";";Stringresult="但是超过预算啰!!";Stringresult2="还可以再多买几本喔!!";
/*任一CheckBox被勾选后,该CheckBox的文字会改变TextView的文字内容*三个对象总共八种情境*/if(mCheckBox1.isChecked()==true&;mCheckBox2.isChecked()==true&;mCheckBox3.isChecked()==true){mTextView1.setText(str0+str1+plus+str2+plus+str3+result);}elseif(mCheckBox1.isChecked()==false&;mCheckBox2.isChecked()==true&;mCheckBox3.isChecked()==true){
mTextView1.setText(str0+str2+plus+str3+result);}elseif(mCheckBox1.isChecked()==true&;mCheckBox2.isChecked()==false&;mCheckBox3.isChecked()==true){mTextView1.setText(str0+str1+plus+str3+result);}elseif(mCheckBox1.isChecked()==true&;mCheckBox2.isChecked()==true&;mCheckBox3.isChecked()==false){mTextView1.setText(str0+str1+plus+str2+result);}elseif(mCheckBox1.isChecked()==false&;mCheckBox2.isChecked()==false&;mCheckBox3.isChecked()==true){mTextView1.setText(str0+str3+plus+result2);}elseif(mCheckBox1.isChecked()==false&;mCheckBox2.isChecked()==true&;mCheckBox3.isChecked()==false){mTextView1.setText(str0+str2);
}elseif(mCheckBox1.isChecked()==true&;mCheckBox2.isChecked()==false&;mCheckBox3.isChecked()==false){mTextView1.setText(str0+str1);}elseif(mCheck
Box1.isChecked()==false&;mCheckBox2.isChecked()==false&;mCheckBox3.isChecked()==false){mTextView1.setText(str0);}}};}
扩展学习
读者可以将OnCheckedChangeListener改为OnTouchListener屏幕触控事件)方法如下:(,
privateCheckBox.OnTouchListenermCheckBoxTouch=newCheckBox.OnTouchListener(){@OverridepublicbooleanonTouch(Viewv,MotionEventevent){
//TODOAuto-generatedmethodstub/*判断在触控笔指压此控件时的状态*/if(mCheckBox1.isChecked()==false){/*当触控笔放开后的动作*/}elseif(mCheckBox1.isChecked()==true){/*当触控笔压下后的动作*/}returnfalse;}};
请试着比较OnCheckedChangeListener与OnTouchListener在使用上的差异。
范例说明
接下来要介绍的是RadioGroup的组事件。RadioGroup可将各自不同的RadioButton设限于同一个Radio按钮组,同属一个RadioGroup组里的按钮,只能做出单一选择(单选题),虽然前一章曾经介绍过RadioGroup与RadioButton,但当时使用的是Button事件,在此要示范“点击”的同时就运行事件处理,不再需要按钮(Button)的辅助了。先设计一个TextViewWidget,以及一个RadioGroup,并于该RadioGroup内放置两个RadioButton,默认为都不选择,在程序运行阶段,利用onCheckedChanged作为启动事件装置,让User选择其中一个按钮时,显示被选择的内容,最后将RadioButton的选项文字显示于TextView当中。
运行结果
▲图4-6
点击帅哥或美女按钮的同时,会立即显示事件结果
范例程序
src/irdc.ex04_06/EX04_06.java
利用OnCheckedChangeListener来启动RadioGroup的事件,随后将被勾选的RadioButton(mRadio1.getText())的文字显示于TextView。
packageirdc.ex04_06;importandroid.app.Activity;importandroid.os.Bundle;importandroid.widget.RadioButton;importandroid.widget.RadioGroup;importandroid.widget.TextView;publicclassEX04_06extendsActivity
{publicTextViewmTextView1;publicRadioGroupmRadioGroup1;publicRadioButtonmRadio1,mRadio2;
/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);
/*取得TextView、RadioGroup、RadioButton对象*/mTextView1=(TextView)findViewById(R.id.myTextView);mRadioGroup1=(RadioGroup)findViewById(R.id.myRadioGroup);mRadio1=(RadioButton)findViewById(R.id.myRadioButton1);mRadio2=(RadioButton)findViewById(R.id.myRadioButton2);
/*RadioGroup用OnCheckedChangeListener来运行*/mRadioGroup1.setOnCheckedChangeListener(mChangeRadio);}
privateRadioGroup.OnCheckedChangeListenermChangeRadio=newRadioGroup.OnCheckedChangeListener()
{@OverridepublicvoidonCheckedChanged(RadioGroupgroup,intcheckedId){//TODOAuto-generatedmethodstubif(checkedId==mRadio1.getId()){/*把mRadio1的内容传到mTextView1*
/mTextView1.setText(mRadio1.getText());}elseif(checkedId==mRadio2.getId()){/*把mRadio2的内容传到mTextView1*/mTextView1.setText(mRadio2.getText());}}};}
扩展学习
在扩展学习里,请加上两个Button在其中,一个为回答,另一个为清除RadioButton的选择状态。程序有随机设置的答案选项,当User点击回答按钮时,比较答案是否正确,若正确,则以AlertDialog对话窗口显示答案结果。
answerButton.setOnClickListener(newButton.OnClickListener(){
publicvoidonClick(Viewv){newAlertDialog.Builder(TEST_56.this).setIcon(R.drawable.icon).setTitle(R.string.ab, out_dialog_title).setPositiveButton(R.string.about_dialog_ok,null).setMessage(R.string.about_dialog_thanks).create();{}}).show();}
在清除Button.onClickListener的事件处理中,只需将被选择的RadioButton取消掉,回到等待回答的状态。
mRadioGroup1.clearCheck();
范例说明
在设计此范例之前,必须先准备三张图片(两张外框图、一张内框图),将这三张图片放在res/drawable下面,在此使用的图片为PNG图形文件,而图案大小最好是调整成手机屏幕大小,或者依据手机的分辨率,动态调整ImageView的大小。稍后的范例将介绍如何调整ImageView的大小,这里就不赘述了。准备好之后,开始做这个酷炫的专业相框应用程序,在Layout当中创建了两个ImageView,且以绝对坐标的方式“堆栈”在一起,在其下方放上两个按钮(Button),按钮的目的是为了要用来切换图片,创建完成后,要在Button事件里处理置换图片的动作。程序目的为点击Button1,ImageView1会出现right的图片,点击Button2,ImageView1会出现left的图片,而ImageView2皆为固定不动(文件名叫oa),这个范例并不难,很快就会知道葫芦里卖的是什么药了,先来看看范例运行结果。
运行结果
图4-7点击按钮后,会更换ImageView(外框)图片
范例程序
src/irdc.ex04_07/EX04_07.java
此程序的关键地方在于getResources()这个方法,这个方法负责访问ResourceID,无论是访问资源里的图文件、文字都要用到getResources();在此使用getResources().getDrawable()来载入res/drawable里的图文件,并将图片放置在ImageView当中。
packageirdc.ex04_07;importandroid.app.Activity;importandroid.os.Bundle;
importandroid.view.View;importandroid.widget.Button;importandroid.widget.ImageView;publicclassEX04_07extendsActivity{/*声明Button、ImageView对象*/privateImageViewmImageView01;privateImageViewmImageView02;privateButtonmButton01;privateButtonmButton02;
/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);
/*取得Button
、ImageView对象*/mImageView01=(ImageView)findViewById(R.id.myImageView1);mImageView02=(ImageView)findViewById(R.id.myImageView2);mButton01=(Button)findViewById(R.id.myButton1);mButton02=(Button)findViewById(R.id.myButton2);
/*设置ImageView背景图*/mImageView01.setImageDrawable(getResources().getDrawable(R.drawable.right));mImageView02.setImageDrawable(getResources().getDrawable(R.drawable.oa));
/*用OnClickListener事件来启动*/mButton01.setOnClickListener(newButton.OnClickListener(){@OverridepublicvoidonClick(Viewv){/*当启动后,ImageView立刻换背景图*/mImageView01.setImageDrawable(getResources().getDrawable(R.drawable.right));}});
mButton02.setOnClickListener(newButton.OnClickListener(){@OverridepublicvoidonClick(Viewv){mImageView01.setImageDrawable(getResources().
getDrawable(R.drawable.left));}});
}}
res/layout/main.xml
创建两个ImageView,一个为外框、另一个为内框,需注意的是,图片需要做一个排序堆栈顺序,将前景图放在上方(以AbsoluteLayout),将背景图放在前景图的下方,这是最简单的堆栈顺序方法。
/> android:layout_x="179px"android:layout_y="356px"/>
延伸学习
学会ImageView之后,在延伸学习里,便可试着将两个ImageButtonWidget堆栈在一起,如此一来,不但有背景图,还有按钮事件。
接着,你就可以自由发挥了。ImageButton的使用方法已经介绍过,而堆栈的技巧可参考这个范例程序,比较不同的地方就是只要点击图片,即可直接做换图的动作,不需要再点击面的Button做更换,需要注意的是图片大小要作调整,不然可能会与ImageButton不合喔!
范例说明
Spinner就是下拉菜单,也等于swing的combobox
、html的