google最近开源了agera框架,
这是一个类似于RxJava的函数式编程框架, 使用时大概就是 push event/pull data的模式。

我参考官方的Samples,改写了[MaterialDesignExample]获取豆瓣书籍的功能。

实现BooksSupplier

Agera中我们需要实现的Supplier接口,获取书籍数据

private List<Book> getBooks() {
HttpUrl url = HttpUrl.parse(getAbsoluteUrl("book/search"))
.newBuilder()
.addQueryParameter("q", key)
.addQueryParameter("start", "0")
.addQueryParameter("end", "50")
.build();

Request request = new Request.Builder()
.url(url)
.build();

try {
Response response = client.newCall(request).execute();
JSONObject json = new JSONObject(response.body().string());
JSONArray jaBooks = json.optJSONArray("books");
Gson gson = new Gson();
List<Book> books = gson.fromJson(jaBooks.toString(), new TypeToken<List<Book>>() {
}.getType());

return books;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}


@NonNull
@Override
public Result<List<Book>> get() {
List<Book> books = getBooks();
if (books == null) {
return Result.failure();
} else {
return Result.success(books);
}
}

阅读全文 »

昨天写了一篇文章介绍了如何使用Hexo建立独立博客,今天为大家推荐几个美观的Hexo博客主题。

NexT

本站就是采用这个主题,简洁美观。
目前Github上Star最高的Hexo主题,支持几种不同的风格。
作者提供了非常完善的配置说明。

作者博客:http://notes.iissnan.com/

Yilia

Yilia 是为 hexo 2.4+制作的主题。
崇尚简约优雅,以及极致的性能。

作者博客:http://litten.github.io/

阅读全文 »

Hexo介绍

Hexo是一个快速、简洁且高效的博客框架。
Hexo使用Markdown来编写文章,通过Hexo生成静态网页,然后部署到服务器上。

安装 NodeJS

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash
nvm install 4

或者到Nodejs官网直接下载安装

https://nodejs.org/en/

安装 Hexo

npm install hexo-cli -g

初始化工作

hexo init blog
cd blog
npm install

hexo server

使用hexo server命令,Hexo会在本地启动一个HTTP服务,
这样就可以在本地打开预览效果了,地址为http://0.0.0.0:4000
停止预览可以使用Ctrl+C终止掉进程。

阅读全文 »

在使用Android Studio创建项目时,Studio一般都会自动创建测试相关的包名和类,
可见测试在Android Studio开发中具有很重要的地位了,但我却从来没有使用过。
今天抽空看了一下Android中现在使用的测试框架Testing Support Library,
其中的Espresso的API是非常友好,且易于使用的。

为了练习使用Espresso进行UI测试,我实现了一个简单的登录界面作为被测试功能。

实现登录功能

创建一个LoginActivity, 输入用户名和密码,然后点击登录按钮跳转
MainActivity,在MainActivity中显示“登录成功”或“登录失败”。

LoginActivity

@Override
public void onClick(View view) {

switch (view.getId()){

case R.id.btnLogin:
Intent intent = new Intent(this,MainActivity.class);
intent.putExtra("name",edtName.getText().toString().trim());
intent.putExtra("pwd",edtPwd.getText().toString().trim());
startActivity(intent);
break;
}

}
阅读全文 »

Android StatusBar中的字体和图标默认都是白色的,但是Android在6.0之前是没有办法更改这个颜色,
在Android 6.0中提供了一个SYSTEM_UI_FLAG_LIGHT_STATUS_BAR,可以将其颜色改为灰色。

效果如下图所示:

修改状态栏颜色,可以通过以下代码实现:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
getWindow().setBackgroundDrawableResource(R.mipmap.window_bg);
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

getWindow().setStatusBarColor(Color.TRANSPARENT);
}

另外我们如果需要去除Toolbar的阴影效果,可以通过设置elevation属性修改

<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:elevation="0dp"
android:background="@android:color/transparent"
android:theme="@style/AppTheme.AppBarOverlay">

<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@android:color/transparent"
app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout>

Android design支持库中提供的TabLayout默认把Tab的OnClickListener给写死了,但是在项目中有时候需要做一些控制处理,比如选中某一个Tab之前必须是先登录,未登录的情况需要跳转到登录界面。

我们可以通过给TabLayout中的TabView重设OnClickListener解决这个问题

重新设置点击事件

viewPager.setAdapter(pagerAdapter);
tabLayout.setupWithViewPager(viewPager);

for (int i = 0; i < tabLayout.getTabCount(); i++) {
TabLayout.Tab tab = tabLayout.getTabAt(i);
if (tab != null) {
tab.setCustomView(pagerAdapter.getTabView(i));
if (tab.getCustomView() != null) {
View tabView = (View) tab.getCustomView().getParent();
tabView.setTag(i);
tabView.setOnClickListener(mTabOnClickListener);
}
}
}
viewPager.setCurrentItem(1);

处理点击事件

private View.OnClickListener mTabOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
int pos = (int) view.getTag();
if (pos == 0) {
Toast.makeText(BottomTabActivity.this, "您还没有登录", Toast.LENGTH_SHORT).show();
//TODO 跳转到登录界面
} else {
TabLayout.Tab tab = tabLayout.getTabAt(pos);
if (tab != null) {
tab.select();
}
}
}
};

在Facebook官方的说明里, 开发React Native应用提示需要OS X系统,
所以一直以为不能在Windows下开发,其实React Native是基于Nodejs环境的,
如果我们只用React Native开发Android应用,完全可以在Windows进行。

以下我按步骤介绍如何在Windows下搭建React Native开发环境:

安装Nodejs

请到官网下载Windows版本的Nodejs,
我是直接下载5.0版本,React Native的要求是4.0以上都可以支持。

安装react-native-cli

npm install -g react-native-cli

初始化项目

react-native init AwesomeProject

init项目时,我这边卡住了很久才初始化完成,可能是下载node_modules太耗时间了。
如果你也在init时卡住的话,可以直接clone我初始化好的项目

git clone https://github.com/chenyangcun/AwesomeProject.git

代码下载完成后,请将项目目录下的node_modules.zip解压到当前目录。

注:如果你的网络较快的话,也可以用npm install下载node_modules

配置环境变量

请设置环境变量ANDROID_HOME指向Android SDK的目录


阅读全文 »

在今年的 Google I/O 15上Google 发布了 新的支持库 ,其中有好几个组件与Material Design设计密切相关,在这些新组件中,你可以找到有几个类似于ViewGroup 的控件,如 AppbarLayout,CollapsingToolbarLayout 和 CoordinatorLayout.
这些ViewGroups 控件提供了非常强大的功能,我决定写一篇文章来介绍相关的配置和技巧。

CoordinatorLayout

顾名思义,这个控件的目的就是协调它里面View的行为。

请看下面的图片:

在这个例子中我们可以看到View之间是如何相互配合的,View会根据其他View的变动做相应的变化。

阅读全文 »

运行时权限介绍

Android 6.0在我们原有的AndroidManifest.xml声明权限的基础上,
又新增了运行时权限动态检测,以下权限都需要在运行时判断:

身体传感器
日历
摄像头
通讯录
地理位置
麦克风
电话
短信
存储空间

运行时权限处理

Android6.0系统默认为targetSdkVersion小于23的应用默认授予了所申请的所有权限,
所以如果你以前的APP设置的targetSdkVersion低于23,在运行时也不会崩溃,
但这也只是一个临时的救急策略,用户还是可以在设置中取消授予的权限。

  • 声明目标SDK版本
    我们需要在build.gradle中声明targetSdkVersion为23
    android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
    applicationId "com.yourcomany.app
    minSdkVersion 18
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
    }
    buildTypes {
    release {
    minifyEnabled false
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    }
    }

阅读全文 »

ECMAScript 6介绍

ECMAScript 6是JavaScript的最新标准,目前在React Native中都可以使用ECMAScript 6语法,作为APP开发者还是很有必要学习一下ECMAScript 6的,或许哪天就是JavaScript的天下了。

环境准备

学习语言新特性,有个REPL环境来练习还是很方便的,我们可以使用nodejs。

  1. 安装Node环境
    使用nvm安装node,以下脚本适合Mac OS安装

    > brew install nvm
    > nvm install node
    > nvm use node
  2. 启动

    > node --harmony --use-strict
  3. Node支持哪些ECMAScript 6特性,
    可以参考ECMAScript 2015 (ES6) in Node.js

参考资料

  1. ECMAScript 6入门
  2. ECMAScript 6 学习笔记
  3. Overview of ECMAScript 6 features
  4. ES6新特性概览
  5. ES6 In Depth