标签‘android’

纯CSS解决iOS下网页不满一屏header、footer随页面滚动问题

前端页面开发或是现在日渐增多的Hybird APP应用开发中,经常遇到模拟原生APP界面效果不佳情况,固定header、footer便是其中一种。

涉及header、footer固定,主体部分可滑动,最初想法一般是

position: fixed

然而,iOS各种下input获取焦点后fixed失效等一系列问题,致使我们不得不选择另辟他径。于是,我们这样玩 查看更多...

Kotlin Android扩展使用及流行框架支持

接上篇,整理一下Kotlin在Android平台上应用的一些实例及方法。

Kotlin Android Extensions

Kotlin针对Android提供了Kotlin Android Extensions,可以很大程度上增强Android的开发体验。
背景
相信每个Android开发人员都很清楚findViewById()函数,并且备受摧残,毫无疑问,大量的findViewById()会造成代码阅读上的干扰和错误定位的难度,虽然有类似Butterknife之类的库可以通过注解实现绑定,但在实际使用过程中还是要为每个变量增加注解,倘若出现大量注解,维护难度应该不亚于直接编码,而其优点无非是代码看起来简洁了,但整体看似乎并不是特别优雅,且需要增加额外的运行库。

现在,Kotlin Android Extensions插件给我们提供了更优雅的方法,且不需要额外引入运行库,比如,我们的代码可以像下面这样写: 查看更多...

是时候在Android开发中使用Kotlin了

早在2015年,就开始断断续续接触Kotlin,最初是因为使用与Kotlin同公司的Intellij IDEA系列,从官网了解到Kotlin,也在博客记录了《初识Kotlin》。去年2月份,Kotlin终于发布了1.0正式版,又一次引爆热点,业内人员纷纷尝试Kotlin开发Android等场景,也有人拿其与Groovy、Scala甚至Swift对比,但与Java相比终归都是民间玩法。

直至今年5.18,Google 在 I/O 2017 上宣布 Android 加入了对 Kotlin 编程语言的支持,并将Kotlin语言作为安卓开发的一级编程语言。至此,Kotlin终于完全被IT界大众所认识(据我所知,在此之前,很多使用Jetbrains系IDE的小伙伴,并不知道Kotlin的存在,也不知道自己日常离不开的IDE就是Kotlin开发的)。

有了Google的大力支持,相信未来必然像当年换ADT为Android Studio一样顺风顺水,毋庸置疑,作为Android程序员的你,是时候开始尝试在Android开发中使用Kotlin了。目前Android Studio 2.x可以安装插件使用,Android Srudio 3.x之后将默认支持Kotlin。下面参考kotlinlang官方使用引导整理了简单的引导教程,这里默认你是已经在使用Android Studio进行日常开发的程序员,细节将一带而过。

安装Kotlin插件

Kotlin插件与3.0版本的Android Studio捆绑在一起。 如果你使用的是较早版本,则需要安装Kotlin插件。在Android Studio的插件管理中直接搜索安装,安装完成后重启即可。 查看更多...

Android系统Web字体/行高异常解决

相信做前端开发的朋友很多时候会遇到这样的问题,设置行高来达到文本垂直居中的目的,但移动端会遇到略偏上或者偏下,通常情况下轻微的偏移可能出现于设备像素密度、容器高度、字体大小等原因,比如30px容器内放15px文字,就做不到完全居中,这个不在今天问题范围,不再赘述。

今天的问题其实算是旧事重提,遇到这个问题,最初是在2015年了,当时团队其他同事做混合app有类似问题,同事最终似乎是采用padding的形式取代了行高,但实际上这个还会引起一些问题,主要是Android系统设置字体后,WebView内字体大小深圳和字体相关的属性都受到影响。

在去年4月份曾写过一篇文章《QQ内置浏览器下网页行高、字体大小显示异常解决》,但是当时只注意到Android系统下手机QQ内嵌的浏览器,直至后期做自己的Android App使用WebView内嵌网页,也发现了同样的问题,经过翻阅网上资料案例,发现近期挺多类似文章和提问,主要原因是Android系统多使用sp作为单位,会根据用户设置缩放字体。

常规的解决方法主要有以下两种 查看更多...

Android优化之SparseArray替代HashMap

Java开发过程中,一般免不了使用HashMap来存储键值对以方便各种需求的实现,但是对于Android这种对内存非常敏感的移动平台,很多时候使用一些Java的API并不能达到更好的性能,相反反而更消耗内存,所以针对Android这种移动平台,也推出了更符合自己的API,比如SparseArray、ArrayMap用来代替HashMap在有些情况下能带来更好的性能提升。

对于SparseArray,比HashMap更省内存,在某些条件下性能更好,主要是因为它避免了对key的自动装箱(int转为Integer类型等),它内部则是通过两个数组来进行数据存储的,一个存储key,另外一个存储value,为了优化性能,它内部对数据还采取了压缩的方式来表示稀疏数组的数据,同时,还实现了SparseIntArray、SparseLongArray、SparseBooleanArray。 查看更多...

Android WebView内嵌网页input无法选择文件解决

最近发现公司APP内嵌的网页点击上传图片没任何效果,查资料得知是Android安全限制,WebView内网页默认没有读取本地文件的权限。虽然网上有解决方案,但是由于Android版本几经波折,API签名大相径庭,想要完全兼容,要实现多个方法,为方便以后使用,简单记录一下。

首先,在使用WebView的页面,增加如下全局变量,方便回调使用:
查看更多...

Android软键盘遮挡输入框问题解决

移动APP、网站有界面底部存在输入框的情况,无论是原生还是WebView内嵌,在软键盘弹出时,经常会有遮挡输入框的问题,解决方法就是让软键盘弹出时窗口自适应,而非软键盘直接悬浮,网上看到有三种解决方案:

1、在你的activity中的oncreate中setContentView之前加上如下代码

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

2、在项目的AndroidManifest.xml文件中界面对应的Activity里加入android:windowSoftInputMode="stateVisible|adjustResize",这样会让屏幕整体上移。如果加上的是android:windowSoftInputMode="adjustPan"这样键盘就会覆盖屏幕。 查看更多...

Android Webview增加自定义userAgent、headers

最近维护公司app,要内嵌在线网站进来,因为在线移动网站是类似常见商城的形式,底部有几个导航按钮,而app内嵌的情况想从网页层面控制页面的返回,同时再针对app内嵌情况下的界面做一些控制。

可能前面说得比较晦涩难懂,下面举个例子,比如,页面有12345五个底部导航,默认进首页(1),当点击2345的时候,在android下点击原生返回键还会回到首页(1),这样的效果体验不是很好,所以页面全局拦截a链接,通过js采用location.replace来做跳转,这样一来,只要内部页面没有直接跳回12345五个页面的操作,整体跳转体验应该和app类似了。

另一个问题,要做微信分享,但是众所周知,网页目前是不可能直接分享到微信(除了二维码形式),所以这里在定义了特定协议,网页请求如share://share?title=朴人博客&content=朴人博客…,原生app内接收后解析处理,在webview上弹出分享界面。 查看更多...

Android Studio …aapt.exe” finished with non-zero…解决

升级Android Studio为2.2.2之后,旧项目编译出错,Android编译时出现如下错误

Error:Execution failed for task ':app:processAndroid360XmDebugResources'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'D:\Develop\Android\sdk\build-tools\21.0.0\aapt.exe'' finished with non-zero exit value -1073741819

搜索良久,很多做法都试了不好使,偶然间发现有人说可能使用JDK8的缘故,果断切JDK7尝试,尝试结果是根本切不回去,Android Studio 2.2.2提示使用JDK 8或者更新的版本。 查看更多...

安卓Adapter中getView方法重复执行及索引错位问题解决

Android开发中,经常会用到ListView,当然,也会用到Adapter为ListView绑定数据。通常,我们采用继承BaseAdapter并实现getView等方法的方式为ListView渲染数据,ListView中每个元素都会去调用getView做渲染。但是,如果ListView要展示数据非常庞大,创建成百上千个View是不可取的,于是乎,Android为我们提供了一套Recycler机制,可以重复利用已创建的View,降低对象开销。

原理如下:

在一个完整的ListView第一次出现时,每个Item都是null的,getView的时候会跑到需要inflate一个Item的代码段,假设整个view只能最多显示10个item,那么当滑动到第11个Item的时候,第一个item会放入"recycler",如果第11个Item和放入"Recycler"的item的view一致,那么就会使用"Recycler"里面的Item来显示,从而不用再重复inflate一次。

图示如下:

adapter-recycler
查看更多...