基本环境

  1. Mac OS X
  2. Node.js 4.0
  3. Xcode 6.3以上版本
  4. Android SDK
  5. watchman和flow

    安装

    1
    npm install -g react-native-cli

初始化

1
react-native init AwesomeProject

开发环境配置

  • iOS XCode6.3及以上即可
  • Android
    • 环境变量ANDROID_HOME
    • SDK Manager
      • Android SDK Build-tools version 23.0.1
      • Android 6.0(API 23)
      • Android Support Repository

运行

  • iOS
    在Xcode中打开工程,直接运行即可
  • Android
    ./android/目录下新建local.properties文件
    把SDK的路径保存在其中
    1
    sdk.dir=.../Android/sdk

执行命令

1
react-native run-android



https://github.com/SeniorZhai/ReactNative_Demo

UIDevice的静态方法currentDevice可以获取到设备信息(UIUserInterfaceIdiom枚举类型),包括PhonePadUnspecifid
其中Phone为手机设备、Pad为平板设备、Unspecifid为未知设备

各类栏的尺寸

状态栏的高度为20PX,NavigationBar为44PX,底栏为49PX

在Fargment中使用

1
2
3
4
5
6
7
<layout>
<date>
<variable
name="user"
type="io.github.seniorzhai.databindingdemo.model.PlainUser" />
</date>
</layout>

在Fragment.java中

1
2
3
4
5
6
7
8
9
onCreateView() {
ItemGridBinding binding = DataBindingUtil.inflate(inflater, R.layout.item_grid, container, false);
PlainUser user = new PlainUser();
user.name.set("SBBBBBBBB");
user.age.set(111);
binding.setUser(user);
binding.getRoot().setBackgroundColor(RandomColor.getColor());
return binding.getRoot();
}

https://github.com/SeniorZhai/DataBindingDemo/blob/master/app/src/main/java/io/github/seniorzhai/databindingdemo/BingdingFragment.java

在GridView中使用

主要的实现代码需要在Adapter的getView方法中实现

1
2
3
4
5
6
7
8
9
10
11
public View getView(int position,View convertView,ViewGroup parent) {
if (convertView == null) {
binding = DataBindingUtil.inflate(inflater,R.layout.item_grid,parent,false);
convertView = binding.getRoot();
convertView.setTag(binding);
} else {
binding = convertView.getTag();
}
binding.setVariable(BR.user,getItem(position));
return converView;
}

https://github.com/SeniorZhai/DataBindingDemo/blob/master/app/src/main/java/io/github/seniorzhai/databindingdemo/MyAdapter.java

在iOS有个概念叫KVO,它提供一致机制,当制定对象的属性被修改时,会发出一条通知。这样每次被观察的对象的属性被修改后,KVO就会自动通知响应的观察者。
Google推出的Data Binding也可以帮我们实现这一点。

Read More

Android Lint是SDK Tools 16(ADT 16)之后Google提供的新工具,它是一个代码扫描工具,能够帮助我们识别代码结构存在的问题,比如:

  1. 无效布局,多重嵌套等
  2. 未使用的冗余资源文件
  3. 国际化的问题(未翻译的文本)
  4. 数组资源大小不一致
  5. 图标缺失、重复、错误尺寸
  6. AndroidManifest.xml中的错误

Lint

Lint工具在/AndroidSDK/tools/文件夹下

使用

  • lint <project directory> lint命令后添加工程目录
  • lint --html <project directory> 生成html格式的报告
  • lint --simplehtml <project directory> 生成简单html格式的报告
  • lint --xml <project directory> 生成xml格式的报告
  • lint --check "UnusedResources" <project directory> 清理冗余资源文件
  • lint --show可获得详细问题列表
    • AdapterViewChildren 确保没有在XML文件中定义它的子view
    • OnClick 确保XML文件声明的OnClick的调用函数在代码中实际存在
    • SuspiciousImport 可疑import的检查
    • UsesMinSdkAttributes 检查是否在AndroidManifest.xml文件中定义了minimum SDK 和 target SDK这两个属性
    • WrongViewCast View强转换的检查
    • MissingRegistered 检查manifest文件中声明的类实际是否存在于工程或工程的libraries中
    • NamespaceTypo 命名空间拼写检查
    • Proguard 混淆配置检查
    • ScrollViewCount 检查ScrollViews是否只有一个child
    • ……

自定义属性类型

1.reference

  • 资源类型
    1
    <attr name="backimg" format="reference"/>

2.color

  • 颜色类型
    1
    <attr name="textColor" format="color" />

3.boolean

  • 布尔类型
    1
    <attr name="focusable" format="boolean" />

4.dimension

  • 尺寸类型
    1
    <attr name="layout_width" format="dimension" />

5.float

  • 浮点类类型
    1
    <attr name="toAlpha" format="float"/>

6.integer

  • 整数类型
    1
    <attr name="visible" format="integer" />

7.string

  • 字符串类型
    1
    <attr name="key" format="string" />

8.fraction

  • 百分比类型
    1
    <attr name="pivotX" format="fraction" />

9.enum

  • 枚举类型
    1
    2
    3
    4
    <attr name="orientation">
    <enum name="horizontal" value="0" />
    <enum name="vertical" value="1" />
    </attr>

10.flag

  • 标记类型(可以与或运算)
    1
    2
    3
    4
    <attr name="mode">
    <flag name="stateVisible" value="0x01">
    <flag name="statePan" value="0x10">
    </attr>

注意

属性可以同时指定多个类型值

1
<attr name="background" format="referce|color" />

闭包(closure)包含了可执行程序(跟方法主体(statements)类似)以及接收(capture)的参数,格式如下

1
2
3
{(parameters) -> return type in
statements
}

  • 闭包可以省略参数的类型和返回值的类型,如果省略了参数类型也要省略in关键字
  • 闭包省略参数,可以使用$0,$1,$2……来引用出现的第一个、第二个、得三个……参数
  • 如果闭包只包含一个表达式,那么表达式就会自动成为该闭包的返回值
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    func1 {
    (x:Int,y:Int) -> Int in
    return x + y
    }

    func2 {
    (x,y) in
    return x + y
    }

    func3 {return $0 + $1}

    func4 { $0 + $1 }