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


    一:

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

  • 相关阅读:
    一文了解Python中的判断语句
    想成为Python全栈开发工程师必须掌握的技能
    Python中变量的命名
    Python中变量的基本使用
    Java使用IO流读取TXT文件
    怎样用 I/O流读取txt文件?
    ORACLE数据库数据被修改或者删除恢复数据(闪回)
    字节流,读取 a.txt 文件内容,并打印出来
    使用js设置input标签只读 readonly 属性
    MyEclipse 选中属性或方法后 相同的不变色
  • 原文地址:https://www.cnblogs.com/ygj0930/p/7612846.html
Copyright © 2020-2023  润新知