- 博客(49)
- 资源 (8)
- 问答 (5)
- 收藏
- 关注

原创 自定义控件:onDraw 方法实现仿 iOS 的开关效果
概述本文主要讲解如何在 Android 下实现高仿 iOS 的开关按钮,并非是在Android 自带的 ToggleButton上修改,而是使用 API提供的 onDraw、onMeasure、Canvas 方法,纯手工绘制。基本原理就是在 Canvas上叠着放两张图片,上面的图片根据手指触摸情况,不断移动,实现开关效果。本文示例代码:https://github.com/heshiweij/Eas
2016-03-24 10:38:42
2693
1

原创 自定义控件:onMeasure 方法和测量原理的理解
前言众所周知,自定义 ViewGroup 中这几个方法非常重要:onMeasure, onLayout。初学者学习自定义 View 时,想必对 onMeasure 比较困惑,onMeasure 是什么,为什么要测量,怎么测量?网上有很多关于 onMeasure 的文章,诸如《onMeasure 详解xxx》、《onMeasure xxx源码分析》。好像都不能彻底解决心中的疑惑。本文就从“是什么”,“
2016-03-20 10:04:08
4351
2

原创 ListView 优化篇:从 BaseViewHolder 到面向 Holder 的思想
接上一篇:ListView 优化篇:从 BaseAdapter 到 BaseViewHolder概述在实际项目中,我们的项目功能越多,代码就越庞大,有时候一个类代码甚至上千行,各种组件之间耦合度很高,而当别人接手你开发的庞大的模块,维护起来也困难。所以就想,能否将一个界面分成多个模块,交个不同的人去实现。将复杂的功能,慢慢分成一个个小模块。上篇,已经成功抽取了一个 BaseViewHolder 的基
2016-03-17 19:27:44
1499

原创 ListView 优化篇:从 BaseAdapter 到 BaseViewHolder
Goole 推荐 Android 程序员使用的 ConvertView + ViewHolder 的模式已经被众人所熟知,现已成为最基础的设计方式,能提升至少 70% 的性能。可以说,写 ListView 不用 ViewHolder 都不能算是合格的 Android 程序员。但是,本文并不打算介绍传统的 ConvertView + ViewHolder 的模式,也不打算直接贴代码敷衍了事,而是站在代
2016-03-16 10:53:48
4410
1
原创 Laravel 配置加载问题记录
Laravel 配置加载问题记录前言遇到一个 Laravel 因配置加载而导致的问题,页面提示:Whoops, looks like something went wrong.查看日志 ( tail -f storage/logs/laravel.log ) 显示:production.ERROR: exception 'RuntimeException' with message '...
2019-11-13 10:47:10
686
原创 IntentService 源码分析
概述官方 IntentService 是一个通过 Context.startService(Intent) 启动可以处理异步请求的 Service ,使用时你只需要继承IntentService 和重写其中的 onHandleIntent(Intent) 方法接收一个 Intent 对象,在适当的时候会停止自己(一般在工作完成的时候). 所有的请求的处理都在一个工作线程中完成,它们会交替执行(但不会
2016-06-20 11:48:36
515
原创 Android 多线程间变量同步的问题
概述在 Android 开发中,常常会遇到这样的需求:主线程用到的成员变量需要在子线程初始化,初始化的过程是异步的,由于 CPU 分配时间片资源是随机的,主线程使用时,该成员变量可能依然是 null,导致空指针。这就是多线程间变量同步的问题。代码如下:public class AsyncMemberInitiation { static User user = null;
2016-06-06 20:27:58
8884
原创 Volley 的使用和执行流程分析
概述Volley 是 2013年Google I/O大会上被提出的网络请求框架。它使得Android应用网络操作更方便更快捷;抽象了底层 Http Client 等实现的细节,让开发者更专注与产生 RESTful Request。另外,Volley 在不同的线程上异步执行所有请求而避免了阻塞主线程。基本使用Volley 适合小而频繁的通信,它的使用方法很简单,只有两步: 1. 创建 Request
2016-05-29 20:59:14
1069
原创 Picasso 源码流程分析
前言Picasso 是非常好用的图像加载框架,它清晰的图片加载流程:with->load->into,即使用当前上下文加载指定路径的图片资源,然后显示在 ImageView 中。所以,分析 Picasso 的源码,可以从它的流程着手。用法回顾:Picasso.with(context).load(uri).into(mImageView);整体流程一. with() 创建必备的对象创建 Downl
2016-05-15 20:29:41
766
原创 Android 发布项目到 jcenter 遇到的坑
前言最近尝试将项目发布到 jcenter,体验一下被 gradle 一句话引入的快感。步骤基本按照 Hongyang 文章来的,但是实际操作过程中遇到了不少的问题,着实原因大致如下:Android Studio 的 bintray-release 插件版本不一致 Gradle 版本不一致,导致语法有差异注释采用中文,导致无法正常生成 Javadoc由于网上这方面的资料比较少,所以针对自己的
2016-04-30 16:55:47
3842
1
原创 IllegalStateException: Recursive entry to executePendingTransactions
是什么该错误的出现场景:在一个 Fragment 中,放置了 ViewPager,ViewPager 内也有三个 Fragment,构成了 Fragment 的嵌套,给 ViewPager 设置 FragmentPageAdapter 时需要传递 FragmentManager,我直接传了 getFragmentMananger() 进去,结果报错。为什么根据官方文档的描述 getFragment
2016-04-30 10:18:15
1159
原创 自定义控件:圆形进度条的实现
前言圆形进度条是很常见的自定义组件,相信大家都看到过,它的实现方式很简单,效果很绚丽,而且代码具有典型性,是学习自定义控件中不可多得的素材。效果由于录制 GIF 小工具的采样频率较低,以上效果图有卡顿,但是在真机上是非常流畅的,这个不必在意。原理照例,贴代码之前,先用大白话描述一下它的原理:首先,在正方形画布上画一个外侧紧贴控件边缘的灰色内切圆(OutCircle)。然后,在相同的位置绘制一个圆环(
2016-04-27 11:39:14
3267
3
原创 Android 根据包名,获取应用程序的签名
前言最近在做一键分享功能。集成微信分享时,需要获取应用程序的签名,微信开放平台也提供了相应的小工具(下载地址),帮助我们获得签名。坑就坑在,这个小工具直接把签名字符串写在了 TexView ,不开源,不输出日志,不能拷贝,只能手抄。这点是非常不舒服的。所以,我花了点时间,根据它的源代码,另外做了一个小工具。核心代码基本是参考微信的,没有做改动。核心代码MainActivity.java /**
2016-04-23 18:17:12
16481
2
原创 解决 Toolbar 的 Menu 图标无法显示的问题
是什么给 Toolbar 设置 Menu 的按钮:main_menu.xml<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" > <item android:id="@+id/
2016-04-19 14:50:53
12705
原创 Failed to resolve attribute at index 6
是什么用 Android Studio 创建了 5.0 的应用,给默认的 Activity 修改主题,从 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">--></style>改为:<style name="AppTheme" parent="android:Theme.Material"></style>就先后
2016-04-19 11:10:00
9314
1
原创 彻底解决 Android Studio 乱码问题
前言Android Studio 前几个版本对中文支持不是很好,经过一段时间的发展,能很好的支持中文了。但是没有经过必要的设置、配置,还是会出现乱码的情况,乱码一般分三个级别:IDE、Gradle、Code(File),IDE 是指 Android Studio 窗口提示文字的乱码、Gradle 是指 Gradle 编译过程中在 Gradle Console 面板出现的乱码、Code(File)是指
2016-04-17 20:40:00
8230
原创 React-Native Android 环境搭建
搭建基础环境JDK推荐 JDK 1.7+ 配置 PATH 环境变量Android Studio下载地址Android SDK建议下载的版本 >= 图中版本C++环境推荐使用 cygwin node.js下载地址 (自带 npm)注:以上软件对于 Android 开发者是必备的,安装过程就不再赘述,node.js cygwin 只需下载安装包,一直下一步即可。安装 React-Native 命令行n
2016-04-10 21:24:19
1140
原创 Android 全局异常捕获的完整实践
前言在 Android 开发中在所难免的会出现程序 Crash,俗称崩溃。用户的随意性访问出现测试时未知的 Bug 导致我们的程序 Crash,此时我们是无法直接获取的错误 Log 的。Crash 极大的影响用户体验,甚至很可能因此被卸载。为了获取错误的 Log 信息,就强烈需要捕获全局的异常信息,当程序出现Crash 信息,记录 Log,上传到服务器,以便开发分析、修复 Bug。原理当程序中出现异
2016-04-05 16:46:24
2632
原创 ViewDragHelper 部分原理分析
前言本周用 ViewDragHelper 实现几个自定义 ViewGroup ,如“QQ 5.0 侧滑菜单”、”仿 SlideMenu 的侧滑菜单”、”ListView 的左滑删除”等。发现,ViewDragHelper 确实是一个不错的工具类,相比自己手写 onTouchEvent 可以省很多代码。但是,在使用过程中也产生了不少的疑问。关于滑动的实现在 Android 中,滑动有两种方式:显示位
2016-04-03 16:07:58
1118
原创 自定义控件:overScrollBy+动画实现 ListView 的头部回弹抖动
前言本文实现一个有趣效果,该效果在老版本的 QQ 空间和微信中可以见到。即:下拉带头部(HeaderView)的 ListView,头部的图片不断放大,松开手指缓慢回弹并伴有抖动效果。示例代码:https://github.com/heshiweij/ParallaxListView效果预览基本原理重写 ListView 的 overScrollBy ,当下拉 ListView 时,根据 delta
2016-04-01 14:03:05
1453
原创 Android 联系人快速索引组件 QuickIndexView
该组件是模仿微信的联系人界面,可直接在项目中使用。下载地址:https://github.com/heshiweij/QuickIndexView特点对联系人进行排序分组右侧触摸滑动快速查找实时在中间显示当前的字母点击联系人条目,返回结果最终效果简单使用导入 QuickIndexView 调用 startActivityForResult 开启界面重写 onActivityResul
2016-04-01 13:14:00
2846
原创 Cannot add header view to list -- setAdapter has already been called.
是什么?直接翻译“无法在列表中添加 header view – setAdapter 已经被调用”,再换句话“不能在调用 setAdapter 之后,向 ListView 添加header view“。这个问题是我在我调试下拉刷新ListView时遇到的(《 自定义控件:含下拉刷新和上拉加载的 ListView》),也算是涨了点姿势。为什么?点开 api17 的 ListView.addHeader
2016-03-29 11:37:14
1098
1
原创 自定义控件:含下拉刷新和上拉加载 ListView 的原理
前言下拉刷新的 ListView,是非常常见的组件。一般情况下,我们会用第三方框架,比如:Android-PullToRefresh、xListView 等实现。第三方框架用起来方便,但如果想个性化定制,需要搞懂其原理。今天,我们自己实现一个支持上拉刷新和下拉加载更多的自定义 ListView,了解其中的原理。基本原理向 ListView 头部和尾部分别添加 HeaderView、FooterVie
2016-03-28 13:07:54
3652
1
原创 ViewDragHelper 实现 ListView 左滑删除
前言因为项目上需要实现收藏夹 ListView 左滑删除的需求,之前用的是第三方框架(SwipeListView)。最近抽空自己动手写个。实现左滑删除其实有很多种方法,ScrollTo+Scroller,HorizentalScrollView,动画等等。 本文就用 V4 包提供强大 View 助手类:ViewDragHelper 实现左滑删除。示例代码,请参见:https://github.com
2016-03-26 19:27:06
3185
2
原创 Android 轻量级轮播组件 CycleViewPager
最近抽空将项目中最常用的一个轮播组件做了简单的封装,支持无限轮播、设置各种属性。可以略微提高开发效率。代码:https://github.com/heshiweij/CycleViewPager特点CycleViewPager 是一个轻量级的无限轮播图展示控件支持自由选择加载网络图片和本地图片优化了 bitmap 的显示,防止 oom 三级缓存优化网络图片,节省流量支持各种属性的设置,可定制
2016-03-26 12:09:32
4175
3
原创 对 ViewGroup 生命周期执行顺序的理解
生命周期在 Android 开发中是非常重要的内容,在学习自定义 ViewGroup 时,生命周期也必不可少。本文就从执行顺序角度,阐述一下自己的观点。执行顺序ViewGroup 常用的生命周期回调:构造方法、onFinishInflate、onMeasure、onSizeChanged、onLayout、onDraw、dispatchDraw。后两个是为 ViewGroup 绘制背景以及绘制子 V
2016-03-26 10:51:23
6105
原创 The specified child already has a parent,you must call removeView()...
是什么?根据错误提示:所指定的 View 已经有父 View 了,你必须掉调用其父 View 的removeViews() 方法。为什么?简单的说,一旦你将你的子 View 添加到父 View 中,父子 View 即建立关联,该子 View 没有消除这个关联之前,是不能被添加到其他的父 View 的,否则有违继承原则,容易引起混乱。怎么样?找到这个子 View 的父亲,调用 removeView(子
2016-03-25 10:38:21
543
原创 自定义控件:onMeasure 和 onLayout 实现流动标签布局
前言前面已经了解了 Android 测量(onMeasure) 的原理,今天我们就用 onMeasure 和 onLayout 实现一个流动标签布局的案例,效果就是对 ViewGrop 中的 TextView 横向排列显示,一行放不下自动换行,并且将剩余的空间平均分配给该行的其他 TextView。本文示例代码:https://github.com/heshiweij/ColorFlowLayout
2016-03-21 11:54:34
1075
原创 RecyclerView 的源码浅析
RecyclerView 是 materials design 中的组件之一,相应的还有CardView 等。从名字看,它主要的特点就是复用。我们之前用的 ListView 也可以复用。但是 RecyclerView 提供了一个耦合度更低的方式来复用 ViewHolder,将实体的内容交给用户,而将缓存的复用、管理维护以及各种动画效果,做了封装。本文主要分析 RecyclerView 的缓存机制,布
2016-03-20 15:21:37
782
原创 Description Resource Path Location Type The project was not built since its
怎么出现?今天开机后,第一次打开 Eclipse,就报这个错误,项目一篇红色的叉叉。打开 Window->Preferences->Android->Build 发现 SDK 路径加载失败。为什么出现?这是因为上一次强行退出 Eclipse,导致这次没有办法加载 Android SDK解决方法?重启 Eclipse
2016-03-19 16:40:50
27668
1
原创 Android抓包分析-fiddler版
本文介绍的是如何使用 Fiddler 工具抓取 Android 应用的 HTTP 协议的数据包。工具Genymotion 模拟器笔记本电脑一台( Win7 )Fiddler(v4.6.2),下载地址:http://pan.baidu.com/s/1sjW9geT环境配置第一步:笔记本联网将笔记本电脑连接网络(有线和无线均可)第二步:设置 Fiddler在 Fiddler 中设置“允许远程连接
2016-03-16 19:57:18
1078
原创 com.google.gson.JsonSyntaxException: 4.1.9
怎么出现?用 Gson 解析服务器数据,并使用了由 atools 自动生成的实体类,结果出现在了如下的错误。往下翻:为什么出现?因为我的 JSON 字符串里含有 “4.1.9” 这个值,而 atools在解析时,误以为是日期格式,导致生成的实体字段类型为 Date。解决方法?手动改了就行特别注意除了乱用字段类型外,atools 工具还会把 JSON中的字符串,全部变成小写,导致严格区分大小写的 G
2016-03-15 13:15:20
1092
原创 unable to execute dex multiple dex files define
怎么出现?Eclipse 项目中导入了多个类库工程并且每个工程都有自己的 v4 包每个 v4 包的版本不一致(MD5 sha1)为什么出现?同上解决方法?非常的简单,只需要打开主工程的 build path->configure build path, 会看到多个 v4 包源,删除或者统一 jar 包即可。附录StackOverFlow 相同问题
2016-03-15 10:31:14
444
原创 java.lang.NoSuchFieldError: android.support.v7.appcompat
怎么出现?在做 GooglePlay 这个项目时,需要将版本从本地迁移到 github,在 commit 时错误的删除了 support-v7 工程的 libs 目录。后来从 sdk/extras/android/support/v7/appcompat/libs 下找到 android-support-v7-appcompat.jar, 重新拷到项目的中,就发生了这个错误。为什么出现?由于项目之前
2016-03-15 10:10:31
632
原创 Android 经典面试题分析
如何在意外回收 Activity 之前保存状态在onSaveInstanceState()中保存其状态。activity被置于后台时,在执行onStop之前,通过onSaveInstacneState 保存当前activity状态。如果被系统杀死,再次被调起时,,在onResume之前,onStart之后,通过 onRestoreInstanceState()来恢复其状态。如果没有被系统杀死,则不执
2016-03-12 20:24:45
328
原创 v7 包下 ActionBar 的一些基本使用
ActionBar的搜索框设置1. 首先必须引入 v7 包,并且设置 Activity 的主题为 v7 包的 AppCompat 主题android:theme="@style/Theme.AppCompat.Light"2. 创建 res/menu/main_menu.xml 并添加 item 为<menu xmlns:android="http://sc
2016-03-11 09:47:04
1689
原创 Android 实战面试题分享
本周参加上海某公司的 Android 的面试,遇到了很多问题,有技术的和非技术的,下面我把之前总结收集的和本周遇到的题目列举出来单独写篇文章,并提供这些问题的答案,希望对大家有帮助。内存溢出的问题你是怎么解决的?一般不会发生OOM,当我们在ListView中加载大图的时候并且上下快速滑动的时候回产生OOM的问题。为了这个这个问题,我废了很大的脑筋。我从网上找了一些缓存策略,网上说缓存分为网络缓存,内
2016-03-06 21:31:41
382
原创 设计模式-建造者模式
本文是对 设计模式-建造者模式 的介绍,主要从以下几个方面阐述:模式介绍两种分类应用场景实际应用示例优缺点分析示例代码已在 Github,请参考: Github模式介绍建造者模式(BuilderPattern)又称为生成器模式,该模式主要用于将一个复杂对象的构建与它的表示分离,向用户屏蔽复杂对象组成部分的创建细节,使得同样的构建过程可以创建不同的表示。建造者模式通常包含如下4个角色UML
2016-02-21 16:26:16
437
2015校园招聘笔试题大合集
2015-01-30
安卓的v4包明明有 getChildFragmentManager 方法为什么调用不到?
2016-04-30
Android应用程序打包时,会将SDK中类的代码一起打包到apk中么?
2016-03-29
Eclipse字段左侧对齐的快捷键是什么?不是ctril+shift+F的代码对齐。
2016-01-08
使用C#.NET的不能操作linux服务器下的ftp,这是为什么?
2015-02-06
TA创建的收藏夹 TA关注的收藏夹
TA关注的人