楚云之南

先解决问题再写代码

View事件传递之父View和子View之间的那点事

Android事件传递流程在网上可以找到很多资料,FrameWork层输入事件和消费事件,可以参考:

  1. Touch事件派发过程详解

这篇blog阐述了底层是如何处理屏幕输,并往上传递的。Touch事件传递到ActivityDecorView时,往下走就是ViewGroup和子View之间的事件传递,可以参考郭神的这两篇博客

  1. Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
  2. Android事件分发机制完全解析,带你从源码的角度彻底理解(下)

郭神的两篇博客清楚明白地说明了View之间事件传递的大方向,但是具体的一些晦暗的细节阐述较少,本文主要是总结这两篇博客的同时,侧重于两点:

  1. 事件分发过程中一些细节到底如何实现的?
  2. view到底如何和父View抢事件,父View又是如何拦截事件不发送给子View,以及如果我们需要处理这种混乱的关系才能让两者和谐相处?。

Recyclerviewde Keng

问题描述

使用RecyclerView版本时,报如下异常:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView$LayoutManager.stopSmoothScroller()' on a null object reference

查看堆栈,是在Activity的Destory方法一路调用到RecyclerViewonDetachedFromWindow里面报的NPE。

Android 视图树状态保存

Android 视图树状态保存

FragmentTabHost引起的思考

公司的项目是一个标准的FragmentTabHostFragment构成的四TAB布局。其中三个TAB中都包含有ListView来展现一个列表。用户在切换TAB时,ListView的当前位置会自动被保存,切换回来之后会自动滚动到上次的位置。

我们知道FragmentTabHost内部对于Fragment的切换使用的是attach和dettach,此时必然会走Fragment的视图树的重建,也就是在切换tab的时候,fragment的UI元素会进行重建,当然也包括重建其中的ListView。那为什么在重建之后Listview能找到正确位置?为了找到解释,我开始查阅代码。

Android Content Provider

ContentProvider作为Android应用之间共享数据的桥梁,为共享数据提供了一个统一的访问方式(一套统一的接口)。

Java中日期时间API小结

Java中为处理日期和时间提供了大量的API,确实有把一件简单的事情搞复杂的嫌疑,各种类:Date Time Timestamp Calendar...,但是如果能够看到时间处理的本质就可以轻松hold住这堆东西了。

Gson源码(二)之JsonReader和JsonWriter

前文介绍了Gson对于Json规范中的类型进行了抽象定义,本文将来介绍stream包中的源码,这一块是Gson的核心代码之一。Gson中的JsonReader和JsonWriter抄自android.util包中的两个类,只是把其中的上下文栈由ArrayList换成了数组,提高了效率。这两个类为Json序列化和反序列化提供了基本接口。

Gson源码分析(一)之Json结构抽象和注解使用

XML和Json作为最常用的两种网络传输格式而被广泛使用,XML在早期数据传输中作为首选,但是近年来Json以其轻量级和更容易编写和解析而越来越流行,Gson作为google的一个开源Json解析框架提供了稳定和快速解析的功能,可以读读它的源代码了解一番。

Android ActionBar

ActionBar作为Android3.0系统引入的一个重要的android app的风格,了解它的使用方法是每一个android开发者都必须要掌握的,本文主要基于android官方文档,对一些不常用的内容进行了删减,整理而成。

Android之菜单

本文参考自官方文档:https://developer.android.com/guide/topics/ui/menus.html

Android为了维护app之间一个统一的操作习惯,提供了Menus来处理用户和Activity之间的一些交互。但是在不同的系统版本上面推荐的Menu不一样。比如在android 3.0以下,由于Google会要求所有设备生产商提供一个菜单的实体键,所以在3.0一下菜单的主要弹出方式就是点击菜单实体键,弹出6个条目的菜单面板。在3.0以后,引入ActionBar,打开菜单行为转变成点击ActionBar上面的overflow按钮。这两种菜单面板的操作一般都是影响到整个app的操作。