《第一行代码》读书笔记一

一:java

1:项目文件android

开发中常常用到的有:数组

app目录:存放项目代码、资源文件缓存

build.gradle:项目全局gradle脚本。app

 

2:app目录ide

libs:放到libs目录下的第三方jar包会自动添加到项目构建路径。工具

java:存放java代码的地方。布局

res:资源文件目录,包括:图片、布局、字符串、颜色、样式、菜单等。gradle

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中的限定符有:

相关文章
相关标签/搜索