keng
文章平均质量分 79
WongWoo1991
不一样的程序猿
展开
-
一、搭建移动应用服务器
搭建一个简单的安卓应用的服务端。采用Struts2+hibernate的架构。IDE使用eclipse,数据库使用MySQL。搭建java开发环境就不说了,百度一大把。一、项目结构本人主要是android开发,了解一点java服务器开发,借用这个机会熟悉一下服务端开发。个人感觉使用Struts就是配置麻烦,先把整个项目的结构图PO在下面,配置随后附上。项目结构如下图所示:原创 2016-07-26 20:17:19 · 1715 阅读 · 0 评论 -
二十二、图文混合排版
我们在APP上看的帖子,有文字又有图片,经过我个人分析,应该就是通过图文混合排版实现的,主要用到的类就是SpannableStringBuilder。在帖子中显示的图片,保存在服务器时,就是一个链接地址,为了便于我们在文章中把图片链接地址找出来,我们规定图片链接的格式是:{image=链接地址},这样我们就可以通过正则表达式找出图片链接和图片的位置,然后替换成图片插入到文章中。一、原创 2016-08-29 16:32:47 · 961 阅读 · 0 评论 -
二十六、自定义输入框--输入法与表情面板切换
自定义的输入框一般都有输入法与表情面板切换的功能,要做到美好的切换体验也是不容易的。切换时不要闪,闪的原因是输入法出现时,会把activity往上挤压,输入法隐藏时,activity又会复原,这个过程,我们的界面就会跳来跳去,给人感觉就是闪瞎眼睛。知道原因后就好解决了,首先给AndroidManifest.xml的activity设置:android:windowSoftInputMode原创 2016-09-13 16:31:36 · 1281 阅读 · 0 评论 -
八、三方登录
三方登录采用友盟SDK,选择SDK类别的时候,选“U-Share分享“,因为分享有带登录的功能,没有专门的三方登录SDK。集成过程就不用说了,按照文档一步步来。遇到一些问题:1、三方登录的昵称有汉字,传到服务器后台的时候是正常的,但是保存到数据库的时候乱码这是由于mysql设置的问题导致的,找到mysql安装目录下的my.ini 配置文件,服务器采用gbk编码,数据库采用utf原创 2016-08-11 17:22:51 · 364 阅读 · 0 评论 -
九、自定义Tab
现在流行的主界面都是底部有几个tab,点击切换到不同的页面,下面我们自定义这个tab控件。采用最简单的自定义控件的方法,继承自android自带控件,继承LinearLayout即可满足要求。public class KengTabHost extends LinearLayout implements View.OnClickListener{ private int tabN原创 2016-08-12 21:15:35 · 374 阅读 · 0 评论 -
十、自定义标题栏
应用中的标题栏都是统一风格的,为了方便使用,我们统一封装自定义标题栏控件,主要用到自定义属性的内容。标题栏的java代码:public class TitleBarView extends RelativeLayout{ private TextView leftTextView; private TextView titleTextView; private T原创 2016-08-13 13:45:35 · 411 阅读 · 0 评论 -
十一、主页fragment
主界面我使用一个MainActivity来控制,4个tab页面分别采用4个fragment来切换,这样每个页面都是单独的存在,逻辑也是相互独立的。定义一个基类fragment,所有的fragment都继承自它:public class BaseFragment extends Fragment{ protected View view; public void setM原创 2016-08-13 14:24:21 · 268 阅读 · 0 评论 -
十二、空白页
当某个页面无内容时,我们需要展示一个空白页给用户,用户才知道是没有加载出内容,点击空白页可以刷新页面。自定义空白页面,经过前篇的自定义控件,写一个自定义空白页应该很简单了:public class EmptyView extends LinearLayout{ private ImageView emptyImageView; private TextView empty原创 2016-08-13 15:38:07 · 378 阅读 · 0 评论 -
十三、签到和小红点功能
当天如果未签到,则在签到的按钮右上角显示一个小红点,点击后红点消失。在主页的fragment创建时判断今天有没有签到,没有签到则显示小红点: private void initData() { if (!SignUtil.isSignedToday()) { // 今日没有签名则显示小圆点 mTitleBarView.s原创 2016-08-13 20:04:20 · 627 阅读 · 6 评论 -
二十四、ViewPager实现图片滑动预览
场景是这样的,用GridView展示了一些缩略图,当点击缩略图时,预览大图,并且可以滑动切换预览图,单击预览图则关闭预览界面,回到之前的缩略图界面。通过上述功能介绍发现,用ViewPager即可完全满足功能。一、使用ViewPager加载预览图片ViewPager使用和ListView、GridView差不多,不做过多介绍,主要是它的adapter稍微有些不一样。先上adapter代码原创 2016-09-05 15:56:32 · 1594 阅读 · 0 评论 -
十八、封装SQLite
把一些数据放在本地数据库,当离线时,展示缓存的数据给用户,不至于什么内容都没有。首先创建数据库类,每次新登录的用户创建不同的数据库:public class KengOpenHelper extends SQLiteOpenHelper{ private static String DB_NAME_ = "user_"; private static int versio原创 2016-08-18 13:40:23 · 301 阅读 · 0 评论 -
二十一、修改头像(2)----上传头像图片
上传图片的存储服务器用的是阿里云的OSS原创 2016-08-20 15:26:29 · 1637 阅读 · 1 评论 -
二十三、发帖多图选择
在发帖时,可以从手机相册选择图片,最多可以选择9张。要实现的效果如图所示:单击右上角的勾勾选择图片或者取消选择。一开始我的实现逻辑是这样的:1、在adapter里面的绑定ViewHolder时,设置勾勾的点击事件:vh.hookImageView.setOnClickListener(new View.OnClickListener() { @Override原创 2016-08-30 10:31:34 · 425 阅读 · 0 评论 -
二十、修改头像(1)----选择相册
点击“从手机相册选择”图片后,打开相册列表,选择一个相册,第一个相册是所有照片。这部分有两个点需要注意,一个是获取所有相册和显示相册图片时容易造成的OutOfMemery异常。一、获取所有相册由于这个过程不是瞬间能够马上完成的,为了防止程序卡死,采用异步的方式加载,封装成一个工具类,加载完成后回调。使用起来就很简单:// 读取相册AlbumUtil.getAllAlbum(t原创 2016-08-19 14:49:52 · 462 阅读 · 0 评论 -
二、客户端开始
上一篇把服务器的基础架构打好了,现在开始android的工作。安卓开发工具使用的是android studio 1.5.1,JDK使用1.8.0 。一、基类activity所有的activity都要继承自BaseActivity,这样可以把一些共用方法提取出来。public abstract class BaseActivity extends FragmentActivi原创 2016-07-27 17:18:11 · 252 阅读 · 0 评论 -
三、腾讯统计和bugly追踪集成
加入腾讯基础统计,我们就可以看到我们的应用的统计数据啦。一、获取SDK去官网注册一个应用,并且下载SDK。二、集成SDK集成方法也非常简便,一步步按照文档来就行了。1、加入jar包。2、AndroidManifest.xml里面添加参数和权限。3、在BaseActivity里面加入方法 public void setMTATag(String原创 2016-07-27 18:01:14 · 1852 阅读 · 0 评论 -
四、封装OkHttp
网络请求使用OkHttp,至于为什么使用它,博客里已经有很多人说过它的优点了。一、引入jar包在build.gradle文件中加入一句即可dependencies { compile 'com.squareup.okhttp3:okhttp:3.4.1'}二、代码封装1、为了便于传递url参数,我们先封装urlpublic class KengHttpBuilde原创 2016-07-28 14:31:55 · 681 阅读 · 0 评论 -
五、集成fresco
图片框架使用fresco,它会自动帮我们下载图片和缓存,还是很强大的。一、集成fresco在build.gradle中添加使用dependencies { compile 'com.facebook.fresco:fresco:0.12.0'}二、代码集成1、在application中初始化Fresco.initialize(this);2、在XML布局文件中使用原创 2016-07-28 16:47:09 · 495 阅读 · 0 评论 -
六、封装EventBus
EventBus是针一款对Android的发布/订阅事件总线。它可以让我们很轻松的实现在Android各个组件之间传递消息,并且代码的可读性更好,耦合度更低。一、代码集成1、下载jar包,并且添加library2、写一个接受消息的虚类public abstract class OnEvent { @Subscribe(threadMode = ThreadMode.Mai原创 2016-07-28 17:44:17 · 2416 阅读 · 1 评论 -
七、广告和启动页
开发是乐趣,盈利是鼓励,于是我们接入广告平台,一般应用都有启动页,我们把二者合一,把广告做在启动页上。一、移动开发平台选择一开始用了一下万普,发现用来做启动页不好做,于是果断放弃,换成多盟。二、布局上半部分显示广告,下面底部显示我们自己的logo,比例为6:1,布局文件如下:<LinearLayout xmlns:android="http://schemas.and原创 2016-07-29 17:28:56 · 520 阅读 · 0 评论 -
十四、自定义联系人导航(上)---字母导航栏
联系人的界面需求是这样的:所有的联系人以首字母分组,右边是字母导航栏,滑动或者单击相应的字母,跳转到对应的分组。首先实现这个自定义字母导航栏。public class TextNavigationView extends View{ private int mWidth, mHeight; // 控件宽高 private int position = -1; // 点击位原创 2016-08-15 20:54:41 · 1212 阅读 · 0 评论 -
十五、自定义联系人导航(中)---带悬停的联系人列表
上一篇我们实现了首字母导航,滑动停止后跳转到相应的联系人分组: mTextNavigationView.setNavigationListener(new TextNavigationView.NavigationListener() { @Override public void onSelect(String text) {原创 2016-08-16 16:13:39 · 1074 阅读 · 0 评论 -
十六、自定义联系人导航(下)---RecyclerView增加头部和事件监听
在listview中我们可以很方便的增加头部view,但是RecyclerView并没有给我们提供相应的方法,而且比较坑的一点,RecyclerView没有提供ItemClickListener方法,需要我们自己去实现,既然RecyclerView提供了灵活性,那么有些事情就需要我们自己去实现了。一、增加头部view其实我这里实现方法是直接把头部放在RecyclerView的item,因为原创 2016-08-16 21:01:20 · 605 阅读 · 0 评论 -
十七、自定义进度对话框
当用户进行需要等待一段时间的操作的时候,我们需要给用户一个等待的反馈,不然用户会以为你的APP卡死了,一般会用一个圆圈来转,但是系统提供的圆圈实在是太丑,所以我自定义一个进度对话框。进度对话框由两部分组成,一个转的圆圈,和提示文字,布局如下:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"原创 2016-08-17 17:38:07 · 413 阅读 · 0 评论 -
十九、使用PopupWindow
一、PopupWindow与AlertDialog的区别最关键的区别是AlertDialog不能指定显示位置,只能默认显示在屏幕最中间(当然也可以通过设置WindowManager参数来改变位置)。而PopupWindow是可以指定显示位置的,随便哪个位置都可以,更加灵活。原创 2016-08-18 23:12:36 · 772 阅读 · 0 评论 -
二十五、本地缓存和网络加载
有这样一个需求,当用户没有网络时,他能查看缓存在本地的帖子,当有网络时,能够查看最新的帖子。我不知道别人是怎么做的,我的实现思路就是:加载页面时,先从本地获取缓存数据,然后再调用网络请求接口(就算网络请求失败,也会显示刚刚本地的数据),获取到最新的的数据后,把数据先保存到本地数据库(而不是直接就去界面显示),然后再从本地数据库提取出最新的数据显示。1、初始化@Overrideprot原创 2016-09-06 14:49:57 · 387 阅读 · 0 评论