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

一:

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

原文地址:https://www.cnblogs.com/ygj0930/p/7612846.html