《疯狂Android讲义》笔记
第二章 android应用的界面编程
2.1 开发自定义的View
继承View基类的子类,然后重写View中的方法。
onFinishInflate(): 当应用从XML布局文件加载该组件并利用它来构建界面之后,该方法将会被回调。
onMeasure(int,int): 调用该方法来检测View组件及它所包含的所有子组件的大小。
onLayout(boolean,int,int,int,int): 当该组件需要分配其子组件的位置、大小时,该方法就会被会回调。
onSizeChanged(int,int,int,int): 当该组件的大小被改变时回调该方法。
onDraw(Canvas): 当该组件将要绘制它的内容时回调该方法进行绘制。
onKeyDown(int,KeyEvent): 当某个键被按下时触发该方法。
onKeyUp(int,KeyEvent): 当松开某个键时触发该方法。
onTrackballEvent(MoyionEvent):当轨迹球事件时触发该方法。
onTouchEvent(MotionEvent): 当发生触摸屏事件时触发该方法。
onWindowFocusChanged(boolean): 当该组件得到、失去焦点时触发该方法。
onAttachedToWindow(): 当把该组件放入某个窗口时触发该方法。
onDetachedFromWindow(): 当把该组件从某个窗口上分离时触发该方法。
onWindowVisibilityChanged(int): 当包含改组件的窗口的可见性发生改变时触发该方法。
2.3 UI组件 textView及其子类
- 实例:不同颜色、字体、带连接的文本(使用textview xml属性)
- 实例:圆角边框。渐变背景的textview(使用xml文件当成drawable 写入background)
- 实例:利用单选按钮、复选框获取用户信息(RadioButton、CheckBox )
- 实例:动态改变布局(ToggleButton 、 Switch)
- 时钟(AnalogClock、DigitalClock)
- AnalogClock模拟时钟,DigitalClock显示数字时钟
- 计时器(Chronometer)
- setBase(long) 设置计时器的起始时间
- setFormat(String) 设置显示时间额格式
- start()
- stop()
- setOnChronometerTickListener() 当计时器改变时触发该监听器。
2.4 UI组件 imageView及其子类
子类:
- ImageButton
- ZoomButton:可以代表放大缩小按钮
- ZoomControls:
QuickContactBadge:关联联系人
//一个ImageView现实另一个Image的局部图片 Bitmap bitmao = bitmaoDrawable.getBitmao(); image2.setImageBitmap(Bitmap.createBitmap(bitmap,x,y,120,120)); image2.setAlpha(alpha);
2.5 UI组件:AdapterView及子类
Adapter常用实现类:
- ArrayAdapter:
- SimpleAdapter:
- SimpleCursorAdapter:
- BaseAdapter:
ListView(列表视图)
ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this,R.layout.checked_item,arr2); list2.setAdapter(adapter2); //创建ArrayAdapter需要指定的参数 //context、textViewResourceId(代表一个TextView,指定布局)、数组或list(指定内容数据)
使用SimpleAdapter创建ListView
- AutoCompleteTextView,MutiAutoCompleteTextView(自动完成文本框)
- gridview(网格视图)
- sinner 下拉框
- AdapterViewFlipper
2.6 UI组件,ProgressBar及其子类
进度条
- 环形进度条(不能显示进度) 和 水平进度条
- 显示在标题上的进度条
显示在标题上的进度条
//设置窗口特征 : 启用显示进度的进度条 requestWindoeFeature(Window.FEATURE_PROGRESS); //设置窗口特征: 启用不显示进度的进度条 requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); //调用Activity的 setProgressBarVisibility(boolean) 或者 setProgressBarIndeterminateVisibility(boolean)即可控制进度条的显示和隐藏
拖动条(seekBar) (继承了ProgresBar)
- 星级评分条(RatingBar):通过星星来表示进度
2.7 UI组件,ViewAnimator及其子类
- ViewSwitcher:代表视图切换组件
- ImageSwitcher(图片切换器)
- 为ImageSwitcher提供一个ViewFactory,viewFactory生成的View组件必须是ImageView
- 切换图片时 只要调用ImageSwitcher的setImageDrawable , setImageResource, setImageURI方法更换图片
2.7.4到第三章之间先跳过把
第三章android的事件处理
3.2基于监听的事件处理
android为不同的界面组件提供了不同的监听器接口,比如View
- View.OnClickListener:单击事件的事件监听器必须实现的接口。
- View.OnCreateContextMenuListener:创建上下文菜单时间的时间监听器必须实现的接口。
- View.OnFocusChangeListener:焦点改变事件的事件监听器必须实现的接口。
- View.OnKeyListener:按键时间监听器必须实现的接口。
- View.OnLongClickListener:长单击时间的事件监听器必须实现的接口。
- View.OnTouchListener:触摸屏事件的事件监听器必须实现的接口。
3.4响应系统设置的事件
//调用Activity的如下方法来获取系统的Configuration对象
Configuration cfg = getResource().getConfiguration();
//然后使用Configuration对象的属性来获取系统配置
在Activity中重写 onConfigurationChanged来响应系统设置更改。
3.5handler消息的传递机制
- 主UI线程中系统已经初始化了一个Looper对象,因此程序直接创建Handler即可
- 自己启动的子线程,必须创建一个Looper对象并启动它
- 调用Looper的prepare()方法为当前线程创建Looper对象
- 调用Looper的loop()方法来启动Looper
3.6异步任务 asynctask
在新线程中更新UI组件方法
- 使用Hanlder
- Activity.runOnUiThread(Runnable)
- View.post(Runnable)
- View.postDelayed(Runnable,long)
使用AsyncTask:
- 创建AsyncTask子类
- 实现doInBackground(Params…):后台线程要完成的任务
- 实现obPregressUpdate(Progress… values):在doInBackground()方法中调用publisjProgressUpdate()方法更新任务进度,将会触发该方法。
- onPreExecute():该方法在执行后台耗时操作钱被调用,一般用于完成初始化准备工作。
- onPostExecute(Result result):当doInBackground()完成后,会自动调用obPostExecute()
- 使用AsyncTask的实例execute(Params…params)开始耗时任务。
第四章 深入了解Activity与Fragment
Activity:
- LauncherActivity
- ExpandableListActivity
- preferenceActivity 配合PreferenceFragment
启动关闭Activity
- startActivity(Intent intent) ;startActivityForResult(Intent intent,int requestCode)
- finish() ; finishActivity(int requestCode)
- startActivityForResult()启动的Activity应该 调用setResult返回结果,当前activity重写OnActivityResult接收结果
使用Bundle在Activity之间交换数据
- Intent
- putExtras(Bundle data) ; getExtras()
- putExtra(String name,xxx value) ; getXxxExtra(String name)
- Bundle
- putXxx(String key,Xxx data) ; getXxx(String key)
- putSerializable(String key,Serializable data) ; getSerializable(String key , Serializable data)
生命周期与加载模式
生命周期
- onCreate()
- onStart()
- onRestart()
- onResume()
- onPause()
- onStop()
- onDestory()
加载模式 (配置Activity时指定android:launchMode属性)
- standard:默认。为目标Activity创建新的实例,并将实例添加到当前Task栈中。
- singleTop:若启动目标Activity已经位于Task栈顶,系统不会创建新的实例,否则与standard模式相同
- singleTask :
- 若目标Activity不存在,则创建并加入栈顶
- 若目标Activity已经位于栈顶,则与singleTop相同
- 若目标Activity存在,且不位于栈顶,则将该activity上的其他activity都移出栈
- singleInstance 在所有Task中只会创建一个目标Activity
fragment
回调:
- onCreate():初始化必要组件
- onCreateView():返回一个该Fragment所显示的View
- onPause(): 当用户离开
- onAttach():当该Fragment被添加、显示到Activity时,回调
- onDetach():当该Fragment从它所属的Activity中被删除时回调
与Activity通信:
- 将Fragment添加到Activity
- 在布局文件中使用