Android开发有一段事件了,是时候整理了,网上有很多好的博客整理的比较好,我顺便就抄写下来,也算是对自己的巩固吧。
Android项目开发建议:
1、全部Activity可继承自BaseActivity,便于统一风格与处理公共事件,构建对话框,统一构造器的建立,万一需要整体变动,一处改动个处处有效。
2、数据库表字段常量和SQL逻辑分离,更清晰,建议使用Lite系列狂降LiteOrm库,超级清晰且重心可以放在业务上不用关心数据库细节
3、全局变量放全局类中,模块私有放自己的管理类中,让常量清晰且集中
4、不要相信庞大的管理类的东西会带来什么好处,可能是一场灾难,而要时刻注意单一原则,一个类专心做好一件事
Android两种方式事件处理
1、基于回调的事件处理
2、基于监听器的事件处理
Android的事件处理机制是一种委派式(Delegation)事件处理方式
普通组件(事件源)将整个事件处理委托给特定的对象(事件监听器),当该事件源发生制定的事件时,就通知所委托的事件监听器,由监听器处理这个事件。
Android默认约定当UI线程阻塞超过20秒,会引发ANR(Application Not Responding)异常
为了找起来方便,暂且分为七大类:显示、存储、通信、发布与调优、进阶用法、与时俱进、继续精进。
显示又分为八块:屏幕、文本、图形、简单控件、自定义视图、动画、窗口、复杂控件;
存储分为六块:资源、内存、键值对、数据库、文件、网络存储;
通信分作六块:组件通信、事件通信、多线程通信、跨进程通信、设备通信、网络通信;
发布与调优分为五块:打包、安全、性能、健壮、兼容;
进阶用法分为六块:java细节、设计模式、图像处理、高级控件、第三方sdk、开发者工具;
与时俱进分为六块:新版控件、多媒体开发、高级动画、行为协调、页面切换、花样输入;
继续精进分为六块:人工智能、混合开发、三维动画、物联网、屏幕特效、视频加工;
dp和px的转换
屏幕分辨率getWindowManager
Drawable资源目录
drawable文件放在res目录的各个drawable目录下,\res\drawable一般放的是描述性的xml文件,图片文件一般放在具体分辨率的drawable目录下。例如
drawable-ldpi里面主要放低分辨率的图片,如QVGA(240×320)
drawable-mdpi里面主要放中等分辨率的图片,如HVGA(320×480)
drawable-hdpi里面主要放高分辨率的图片,如WVGA(480×800),FWVGA(480×854)
drawable-xhdpi里面主要放加高分辨率的图片,如Nexus(720×1280)以上分辨率
drawable-xxhdpi里面主要放超高分辨率的图片,如Nexus(1080×1920)以上分辨率
StateListDrawable是在一个xml文件中定义不同状态下呈现的图像。下面是一个例子btn_visit_selector.xml
state_pressed:为true时表示按下,一般用于按钮Button,图形设置于android:background
state_checked:为true时表示勾选,一般用于单选框RadioButton、复选框CheckBox,图形设置于android:drawableLeft
state_selected:为true时表示选中,一般用于单选框RadioButton、复选框CheckBox,图形设置于android:background
state_focused:为true时表示获取焦点,一般用于文本框EditText,图形设置于android:background
shape的定义文件是xml,以shape元素为根节点。根节点下定义了六个节点:corners(圆角)、gradien(渐变)、padding(间隔)、size(尺寸)、solid(填充)、stroke(描边),各节点的属性值主要是各种长宽、半径、角度,以及颜色。
visibility各取值的区别 : 该属性有三个取值,分别是:visible表示可见,invisible表示不可见,gone表示消失
View是单个视图,所有的控件类都是从它派生出来;而ViewGroup是个视图组织,所有的布局视图类都是从它派生出来。由于View和ViewGroup是基类,因此很少会直接使用,偶尔用到的场景,主要有如下几个:
1、页面上需要单独显示一条横线或者竖线。如果填充图片显然不够经济,最简单的做法,就是在xml布局中增加一个View控件,高度或宽度设置为1dp,背景颜色设置为线条颜色,这样便实现了单独显示线条的需求。
2、点击事件的处理函数onClick(View v),这里面我们要调用View的getId方法获取发生点击事件的控件id,从而进行该控件对应的点击处理。
3、在代码中设置某控件为可见或不可见或消失,此时需要使用View类的三个变量,分别是View.VISIBLE、View.INVISIBLE和View.GONE。
Button是文本按钮(继承自TextView),而ImageButton是图像按钮(继承自ImageView)。两者之间的区别在于:
1、Button即可显示文本也可显示图形(通过设置背景图),而ImageButton只能显示图形不能显示文本;
2、Button可在文本周围区域显示小图,而ImageButton无法在某个区域显示小图;
3、ImageButton上的图像可按比例进行拉伸,而Button上的大图会拉伸变形(因为背景图无法按比例拉伸);
从上面可以看出,Button的适应面更广,所以实际开发中基本使用Button。
CheckBox
CheckBox是复选框,点击勾选,再点击则取消勾选。CheckBox是CompoundButton的一个子类,所以继承了CompoundButton的所有属性和方法。
RadioGroup和RadioButton
RadioButton是单选框,点击选中,但是再点击不会取消选中。只有点击同组的其他RadioButton,原来勾选的RadioButton才会取消选中。RadioButton也是CompoundButton的一个子类,所以继承了CompoundButton的所有属性和方法。
RadioGroup是容纳多个RadioButton的组布局,同组中只能有一个RadioButton被选中。下面是RadioGroup常用的几个方法:
setCheckedId : 选中指定ID的RadioButton。
getCheckedRadioButtonId : 获取选中状态RadioButton的ID。
setOnCheckedChangeListener : 设置勾选变化的监听器。
自定义视图存在三个构造函数,分别是
//只有一个参数,用于在代码中构造对象
public SignatureView(Context context) {
super(context);
}
//有两个参数,用于在XML布局中构造对象
public SignatureView(Context context, AttributeSet attrs) {
super(context, attrs);
if (attrs != null) {
TypedArray attrArray=getContext().obtainStyledAttributes( attrs, R.styleable.SignatureView);
mPaintColor = attrArray.getColor(R.styleable.SignatureView_paint_color, 0);
attrArray.recycle();
}
}
//有三个参数,用于在XML布局中构造对象
public SignatureView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
三个可进行绘制的方法
在自定义视图中,有三个函数可以重写用于界面绘制,在视图创建过程中,三个函数的执行顺序依次是:onLayout、onDraw、dispatchDraw。
1、onLayout(boolean changed, int left, int top, int right, int bottom) :
onLayout用于定位该视图在上级视图中的位置,从其参数中就可以看出来。由于该函数没有画布,因此只适合绘制现成的视图控件。
2、onDraw(Canvas canvas) :
自定义控件一般是重写onDraw方法,在画布中绘制各种图形。
3、dispatchDraw(Canvas canvas) :
dispatchDraw与onDraw的区别在于:onDraw在绘制下级视图之前,而dispatchDraw在绘制下级视图之后,所以如果不想自己的绘图被下级视图覆盖的话,就要在dispatchDraw中进行绘制操作。为方便记忆,只要是从ViewGroup衍生出的视图,都用dispatchDraw,其他小控件都用onDraw。
菜单Menu
Android的菜单分为两类:选项菜单和上下文菜单,默认使用选项菜单。菜单的布局文件存放在res/menu目录下,使用ADT新建一个Android工程,首页代码MainActivity中会自动生成onMenuOpened和onMenuItemSelected函数代码。
下面是选项菜单需要重写的方法:
onMenuOpened : 在菜单弹出时调用,一般无需重写
onMenuItemSelected : 在菜单项选择时调用,查看该方法的源码,会发现该方法内部做分支处理,判断如果是选项菜单则调用onOptionsItemSelected,如果是上下文菜单则调用onContextItemSelected。一般无需重写
onCreateOptionsMenu : 在页面打开时调用,需要重写指定菜单项目
onOptionsItemSelected : 在选项菜单的菜单项选中时调用,需要重写对不同菜单项做分支处理
onPrepareOptionsMenu : 在准备打开选项菜单时调用,一般无需重写
onOptionsMenuClosed : 在选项菜单关闭时调用,一般无需重写
AlertDialog
Android中最常用的对话框是AlertDialog,它可以完成常见的交互操作,如提示、确认、选择等等,然后就是进度对话框ProgressDialog
AlertDialog没有公开的构造函数,必须借助于AlertDialog.Builder才能完成参数设置。Builder的常用方法如下:
setIcon : 设置标题的图标。
setTitle : 设置标题的文本。
setCustomTitle : 设置自定义的标题视图。
–以上方法用于设置标题部分。注意setTitle和setCustomTitle只能设置其一,不能重复设置。
setMessage : 设置内容的文本。
setView : 设置自定义的内容视图。
setAdapter : 设置List方式的内容视图。使用较麻烦,一般不用。
setItems : 设置Spinner方式的内容视图。窗口显示与对话框模式的Spinner极为相似,没有底部的按钮,一旦选中某项就立即关闭对话框。
setSingleChoiceItems : 设置单选列表的内容视图。与setItems的区别在于有显示底部的交互按钮,并且每项右边有单选按钮。
setMultiChoiceItems : 设置多选列表的内容视图。底部有交互按钮,并且每项右边有复选按钮。
–以上方法用于设置内容部分。注意这些方法互相冲突,同时只能设置其一。
setPositiveButton : 设置肯定按钮的信息,如文本、点击监听器。
setNegativeButton : 设置否定按钮的信息,如文本、点击监听器。
setNeutralButton : 设置中性按钮的信息,如文本、点击监听器。
–以上方法用于设置交互按钮。
WindowManager
getDefaultDisplay : 获取默认的显示屏信息。通常用该方法获取屏幕分辨率
addView : 往窗口添加视图。第二个参数为WindowManager.LayoutParams对象。
updateViewLayout : 更新指定视图的布局参数。第二个参数为WindowManager.LayoutParams对象。
removeView : 往窗口移除指定视图。
TabBar
1、使用TabActivity。其中在布局文件中设置TabHost、TabWidget和RadioButton,在代码文件中应用TabActivity、TabSpec和CompoundButton。
2、使用ActivityGroup。将几个栏目的首页Activity都放入ActivityGroup,然后根据点击事件选择切换到哪个Activity。
3、使用FragmentActivity和Fragment。将几个栏目的首页Fragment都放入FragmentActivity,可自动响应点击事件。
其中TabActivity继承自ActivityGroup,目前Android声称TabActivity与ActivityGroup都已废弃,建议采用Fragment和FragmentManager来代替。从实现代码来看,TabActivity和ActivityGroup两种方式的代码量都较多,而FragmentActivity方式的代码就显得很简洁,所以博主也推荐第三种方式。
标题栏ActionBar
1、在AndroidManifest.xml中给activity设置无标题栏的主题,就关闭ActionBar。否则就显示
2、在styles.xml的当前主题中加入一个项android:windowNoTitle,为true时表示关闭ActionBar;为false表示显示
3、在Activity代码的setContentView之前加入下面代码,就关闭ActionBar。否则就显示
requestWindowFeature(Window.FEATURE_NO_TITLE);
4、在Activity代码中获得ActionBar实例,调用该实例的hide方法表示关闭ActionBar;调用show方法表示显示
ActionBar actionBar = getActionBar();
if (actionBar != null) {
actionBar.hide(); //隐藏ActionBar
actionBar.show(); //显示ActionBar
}
ViewPager
下面是ViewPager的常用方法:
setAdapter : 设置ViewPager的适配器
setCurrentItem : 设置当前的页码,即默认打开ViewPager时显示哪一页的内容。
setOnPageChangeListener : 设置ViewPager的页面变化监听器。
ViewPager的适配器
ViewPager的监听器
ViewPager一般不监听每个页面项的点击事件,而是监听页面滑动的监听事件,对应的监听器类是OnPageChangeListener。该类的三个方法介绍如下:
onPageScrollStateChanged : 翻页状态改变时调用,状态参数取值说明为:0表示静止,1表示正在滑动,2表示滑动完毕。在翻页过程中,状态值变化依次为:正在滑动->滑动完毕->静止。
onPageScrolled : 在翻页过程中调用。该方法的三个参数取值说明为:第一个参数表示当前页面的序号;第二个参数表示当前页面偏移的百分比,最小值为0,最大值为1;第三个参数表示当前页面的偏移距离,单位px。
onPageSelected : 在页面选择时调用,该方法用得较多。位置参数表示当前页面的序号。
WaterfallGridView,StaggeredGridView,PinterestLikeAdapterView