一:
1:项目文件
开发中经常用到的有:
app目录:存放项目代码、资源文件
build.gradle:项目全局gradle脚本。
2:app目录
libs:放到libs目录下的第三方jar包会自动添加到项目构建路径。
java:存放java代码的地方。
res:资源文件目录,包括:图片、布局、字符串、颜色、样式、菜单等。
AndroidManifest.xml:项目配置文件。多用于注册四大组、添加权限等。
proguard-rules.pro:项目代码混淆规则。
3:build.gradle逐项解析
apply plugin: 'com.android.application'//说明module的类型,com.android.application为程序,com.android.library为库 android { compileSdkVersion 22//编译的SDK版本 buildToolsVersion "22.0.1"//编译的Tools版本 defaultConfig {//默认配置 applicationId "com.nd.famlink"//应用程序的包名 minSdkVersion 8//支持的最低版本 targetSdkVersion 19//支持的目标版本 versionCode 52//版本号 versionName "3.0.1"//版本名 } sourceSets {//目录指向配置 main { manifest.srcFile 'AndroidManifest.xml'//指定AndroidManifest文件 java.srcDirs = ['src']//指定source目录 resources.srcDirs = ['src']//指定source目录 aidl.srcDirs = ['src']//指定source目录 renderscript.srcDirs = ['src']//指定source目录 res.srcDirs = ['res']//指定资源目录 assets.srcDirs = ['assets']//指定assets目录 jniLibs.srcDirs = ['libs']//指定lib库目录 } debug.setRoot('build-types/debug')//指定debug模式的路径 release.setRoot('build-types/release')//指定release模式的路径 } signingConfigs {//签名配置 release {//发布版签名配置 storeFile file("fk.keystore")//密钥文件路径 storePassword "123"//密钥文件密码 keyAlias "fk"//key别名 keyPassword "123"//key密码 } debug {//debug版签名配置 storeFile file("fk.keystore") storePassword "123" keyAlias "fk" keyPassword "123" } } buildTypes {//build类型 release {//发布 minifyEnabled true//混淆开启 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'//指定混淆规则文件 signingConfig signingConfigs.release//设置签名信息 } debug {//调试 signingConfig signingConfigs.release } } packagingOptions { exclude 'META-INF/ASL2.0' exclude 'META-INF/LICENSE' exclude 'META-INF/NOTICE' exclude 'META-INF/MANIFEST.MF' } lintOptions { abortOnError false//lint时候终止错误上报,防止编译的时候莫名的失败 } } dependencies { compile fileTree(dir: 'libs', exclude: ['android-support*.jar'], include: ['*.jar']) //编译lib目录下的.jar文件 compile project(':Easylink')//编译附加的项目 compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3'//编译来自Jcenter的第三方开源库 }
4:菜单
菜单有多种:optionMenu、上下文菜单、弹出菜单等。
菜单可以在代码中动态添加,也可以在xml中定义好菜单项,在代码中加载。
菜单可以分组管理菜单项,也可以拥有子菜单。
5:Intent
Intent可以用于启动四大组件,可以携带数据,不过只能通过键值对的形式携带基本类型数据。
Intent有两种:显式Intent和隐式Intent。
隐式Intent通过添加action、category、data等附加内容,来匹配系统中符合要求(注册时配置 intent-filter)的活动、服务等。
6:返回数据的跳转
启动另一个活动可以有两种方法,其中startActivityForResult(intent,请求码)启动的跳转,可以在活动中重写回调方法onActivityResult(请求码,结果码,intent)来获取返回数据,通过请求码匹配具体请求的返回、通过结果码判断结果的类型,通过intent提取返回的数据。
7:保存Activity中的数据
活动跳转后,之前的活动可能会被回收,若想保存之前的活动的数据,使得返回这个活动时数据仍在,可以在活动中重写 onSaveInstanceState(bundle)回调方法,这个方法会在活动被回收之前调用,把数据存在budle中,那么下一次该活动重建时,可以在onCreate(bundle)中通过bundle取回数据。
8:精确定位活动
可以定义一个BaseActivity,继承自AppCompatActivity,然后定义一些通用的方法、操作,如:打印当前活动信息。
另其他活动继承BaseActivity,即可在项目运行时知道哪个页面对应哪个活动了。
9:批量管理活动
可以定义一个工具类,其中维护一个活动list:
public class ActivityCollector { public static List<Activity> activities = new ArrayList<>(); public static void addActivity(Activity activity){ activities.add(activity); } public static void removeActivity(Activity activity){ activities.remove(activity); } public static void finishAll(){ for(Activity activity:activities){ if(!activity.isFinishing()){ activity.finish(); } } activities.clear(); }
然后,定义一个父Activity,作为其他activity的基类:
public class BaseActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityCollector.addActivity(this); } @Override protected void onDestroy() { super.onDestroy(); ActivityCollector.removeActivity(this); } }
其他Activity继承BaseActivity,那么每当活动创建时就会被添加到list中,销毁就移除。在任何需要批量销毁活动,完全退出程序时,只需通过 ActivityCollector.finishAll() 销毁所有活动即可。
二:UI
1:android:gravity:控件中内容的对齐方式。
2:android:layout_gravity:控件本身在父容器中的对齐方式。
3:进度条
有两种,其中:圆形的用于显示耗时操作,通过visibility控制可见性来显示或隐藏;水平进度条则可以通过在代码中动态设置progress来更改进度值,多用于下载等操作。
4:弹窗
AlertDialog的使用步骤为:创建builder——通过builder.setXX()设置弹窗标题、内容、按钮点击事件等——最后显示弹窗
5:进度弹窗
不同于一般的环形进度条,ProgressDialog还额外显示文字内容,以告知用户当前正在执行什么耗时操作。
创建progressdialog——设置标题、内容等——show()显示——通过dismiss()关闭
6:布局
线性布局中的比例布局:设置哪个方向上按比例布局,则该方向上大小设置为0dp,然后通过layout_weight设置权重。
相对布局:控件与父容器的相对、控件与已有控件的相对,布局的位置规律为:相对于参照物的上下左右中。
帧布局:帧布局中的控件末日左上角对齐,并且后定义的控件会覆盖在最上面。帧布局可以用于自定义一些需要重合在一起的视图元素,比如:自定义带文字的图片按钮、带有文字提示的视频播放界面、浮动在图片或视频播放控件之上的字幕等。
百分比布局:可以使用第三方扩展库。
7:自定义控件
方法一:使用布局定义好一个视图效果,然后在其他布局文件中include。
方法二:继承android内置控件类定义新的控件类,在控件类的构造方法中inflate定义好的layout文件,然后在其他布局文件中通过新控件类的完整路径来使用该控件。
8:ListView的使用步骤
定义数据类——定义列表项视图布局——继承Adapter,定义adapter类,重写getview方法:获取当前数据项、inflate列表项布局文件、为列表项控件赋值、返回view
在活动代码中,创建数据数组——创建adapter,把上下文、列表项布局文件id、数据数组作为参数——为activity视图中的listview设置adapter
9:listview的优化
初步优化,使用convertView缓存之前加载的布局;
进一步优化,创建一个内部类ViewHolder,里面的成员变量和view中所包含的组件个数、类型相同,在convertview为null的时候,把findviewbyId找到的控件赋给ViewHolder中对应的变量,就相当于先把它们装进一个容器,下次要用的时候,直接从容器中获取。
10:RecyclerView的使用
定义适配器类,重写其中的三个方法——在activity代码中创建数据数组——创建layoutmanager,通过layoutmanager设置布局方式,并设置给recyclerview控件——创建adapter——为activity布局文件中的recyclerview控件设置adapter
【我们看到,RecyclerView不仅需要adapter,还需要layoutmanager。通过layoutManeger,我们可以设置RecyclerView的布局排列方式:垂直、水平、网格、瀑布流】
【列表项的点击事件在adapater中定义,可以定义列表项整体点击、列表项中不同空间元素点击 的事件响应】
【常用的RecyclerView开源库整理:http://www.jianshu.com/p/154891851fe2 http://blog.csdn.net/mynameishuangshuai/article/details/51153978】
三:碎片
1:碎片的使用步骤
定义布局文件——创建碎片类,继承自Fragment,重写onCreateView方法,在其中inflate对应的布局文件——在activity的布局文件中通过路径使用碎片、在代码中动态使用碎片
2:在代码中动态使用碎片
创建碎片实例——获取FragmentManager——beginTransaction()——add、replace、remove动态使用碎片实例——commit()
3:模拟返回栈
把碎片的使用历史加入返回栈中,点击返回按钮时返回上一个碎片而不是退出当前activity。
创建碎片实例——获取FragmentManager——创建transaction——add、replace、remove动态使用碎片实例——transaction.addToBackStack(null)——commit()
4:碎片与活动之间的通信调用
活动中调用碎片:在activity代码中通过findFragmentById(id)获取活动布局中的碎片实例,然后通过该实例调用碎片类中的方法、为碎片中的控件赋值等
碎片中调用活动:碎片代码中国年通过getActivity()方法获取与当前碎片相关联的活动实例,然后通过该实例调用方法、操作控件
碎片之间的调用:在一个碎片中获取关联的活动实例,然后通过活动实例获取另一个碎片实例,通过另一个碎片实例即可进行调用。
5:碎片保存临时数据
类似于activity实例,碎片也可以通过onSaveInstanceState()方法保存数据,之后在碎片的onCreateView等方法中都可以通过参数bundle重新提取。
6:碎片的适配
在res目录下新建 layout-限定符 文件夹,在其中定义布局文件,那么程序在运行时,就会根据屏幕的尺寸,自动加载符合格式的文件夹下的视图文件。
android中的限定符有: