0%

今天在发布版本的时候测试升级安装发现从服务器上下载的apk从代码里跳转到安装界面进行升级安装的时候出现了点问题,安装完成以后一闪而过回到了Android桌面,但是应用又安装成功了,从应用列表启动确实是新版本的应用。为什么会出现这样的情况呢?这种现象会给用户带来很不好的体验,让用户认为是安装失败了。经过一系列的Google查找换了N个搜索关键字,最后终于找打了解决办法。记录一下。
调用升级安装的代码是这样的:

1
2
3
4
5
Uri uri = Uri.fromFile(new File(filePath));
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri,
"application/vnd.android.package-archive");
startActivity(intent);
阅读全文 »

项目中经常会遇到这样的需求:在一段文字后面跟一个图标或者其他效果。如果是单行文字的话很好解决使用简单的布局进行控件组合就能完成,但是如果遇到文字有换行的情况使用简单的布局组合可能实现起来就比较麻烦了甚至是实现不了。那么这个时候我们就需要自定义view来实现,或者重写TextView、或者重写View自己绘制、或者重写ViewGroup来实现。我这里介绍的实现方法就是重写ViewGroup的方式,自定义ViewGroup里子控件的位置来实现。

先看一下下面的效果图:
dis
上面的效果图上有三种效果,第一种是在一段文字后面跟一个有特殊效果的文字,第二种是在文字末尾跟一个图标,第三个是在文字末尾跟一个layout,layout里面包含两个ImageView。

阅读全文 »

一般我们在开发中做按钮点击效果都是用两张图片或者两种颜色写selector的xml文件.但是有时候我们可能面临只有一张图片也需要实现类似的点击效果,这个时候怎么办呢?
其实也很好办,同样用selector来实现.
先实现第一种效果点击图片变暗的效果,思路很简单就是在图片上面覆盖一层半透明白色,selector如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!--?xml version="1.0" encoding="utf-8"?-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<layer-list>
<item android:drawable="@drawable/test" />
<item>
<shape android:shape="oval" >
<solid android:color="#51000000" />
</shape>
</item>
</layer-list>

</item>

<item android:drawable="@drawable/test" />
</selector>

在pressed为true的状态下使用了layer-list里面包含了一张图片和一个shape实现的半透明覆盖层,这样点击的时候效果就是图片变暗从而实现点击效果
pressed
是不是很简单.

阅读全文 »

在自定义view中用到canvas绘制文字的时候常常会碰到要求文字居中或者自动换行的需求,接下来我就介绍一下我的实现方法。
首先绘制文字居中:
绘制文字时可以通过Paint的getFontMetrics()方法得到文字度量相关信息如下图:
20130827162047703
上图所示的top、bottom、ascent、descent都是根据Paint的getFontMetrics()得到的FontMetrics取到的。
baseline是绘制文字Y坐标的基准点,也就是Y坐标的0点位置,向上为负,向下为正。所以descent是一个正值而ascent是一个负值。所以文字的真实高度是descent-ascent。

阅读全文 »

现在项目里将Listview都替换成了用Recyclerview来实现,所以很多地方都需要监听Recyclerview是否滑动到底部然后触发某些操作。
通过添加Recyclerview的OnScrollListener来判断Recyclerview是否滑动到底部。具体代码如下:

阅读全文 »

Android中使用Viewpager+Fragment很简单就能实现一个左右滑动翻页的功能,但是只能实现固定的页数的左右滑动。为了实现左右无限滑动的功能想到了可以给adapter的getCount()返回一个足够大的数值,比如Integer.MAX_VALUE。于是写了代码测试一下:
adapter继承至FragmentStatePagerAdapter,因为页面会很多,所以使用FragmentStatePagerAdapter只会缓存前一页、当前页、上一页三页的界面,将其他未显示的页面回收,但是会缓存已回收的Fragment的状态SavedState,可以在自定义的Fragment里重写onSaveInstanceState方法将数据保存到SavedState里,然后在onActivityCreated里进行数据恢复。设置adapte的getCount()返回值为Integer.MAX_VALUE,在Activity里设置Viewpager当前显示页为mViewPager.setCurrentItem(Integer.MAX_VALUE/2);中间位置,这样就可以左右无限滑了。

阅读全文 »

之前在项目中遇到一个问题,在一个含有Listview的界面底部的EditText弹出软键盘时会将整个界面包括Actionbar往上顶的蛋疼问题。
很蛋疼的问题,当时试了很多种解决办法,也在网上找了很多办法。修改android:windowSoftInputMode属性值、调整布局甚至将布局调整到跟另外一个效果正常的项目一样的布局也还是没解决这个问题。最后没办法赶项目在不影响功能的正常使用下就先那样了。
今天在无意中浏览stackoverflow网站的时候看到一个在使用Recyclerview的时候遇到一个同样的问题,解决办法是在布局的顶部添加一个空的Scrollview实现了不将Actionbar往上顶的效果。于是赶紧打开之前的项目找到布局文件在顶部添加了一个空的Scrollview。

阅读全文 »

首先使用yum命令安装php及相关扩展,命令如下:

1
yum install php-mysql php-gd libjpeg* php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-mcrypt php-bcmath php-mhash libmcrypt libmcrypt-devel php-fpm 

安装过程很简单,安装过程中遇到提示输入y回车即可。
安装完PHP后接下来我们就要配置nginx支持php应用。

阅读全文 »

Centos安装nginx记录如下:

为了追加 nginx 的 yum 仓库,需要创建一个文件 /etc/yum.repos.d/nginx.repo,并将下面的其中一个内容复制进去:

CentOS:

1
2
3
4
5
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
阅读全文 »

现在app开发中使用下拉刷新的效果是很频繁的。网上也有各种第三方的实现方法,github上也有很多开源的项目。Google在v4包里也添加了一个下拉刷新的控件,就是SwipeRefreshLayout。SwipeRefreshLayout在5.0之前的v4包的效果是顶部有一个颜色条,5.0之后就是拉出一个悬浮的旋转的圈。说实话SwipeRefreshLayout这个控件很好用,用起来也很简单方便,但是下拉的效果不是我想要的,因为项目要求使用传统的下拉效果也就是下面这种效果:
下拉刷新
所以我就在想能不能修改SwipeRefreshLayout的源码来达到自己想要的效果呢?说做就做,从sdk卡的extras\android\support\v4\src\java\android\support\v4\widget目录下找到了SwipeRefreshLayout.java的源文件以及依赖的两个文件SwipeProgressBar.java、BakedBezierInterpolator.java。将这三个文件拷出来看是看源码并着手修改。花了一下午的时间终于实现了,先看一下效果:
下拉效果

阅读全文 »