============================
自定义View用Canvas画文字时,需要让整个字符串在某个点居中显示,比如字符串的中心点必须位于坐标(50,50)处。
下面是一个简单的自定义TextView,以此来说明如何让字符串居中显示。代码中的注释笔记详细了。
1 | /** |
效果图:
原创,转载请指明出处(http://blog.xinspace.xin)。
============================
自定义View用Canvas画文字时,需要让整个字符串在某个点居中显示,比如字符串的中心点必须位于坐标(50,50)处。
下面是一个简单的自定义TextView,以此来说明如何让字符串居中显示。代码中的注释笔记详细了。
1 | /** |
效果图:
原创,转载请指明出处(http://blog.xinspace.xin)。
============================
原创,转载请指明出处(http://blog.xinspace.space)。
Dialog的需求:需要背景是白色,不是Android的默认透明半黑色。
于是Dialog使用了自定义主题,并用Dialog的自定义View覆盖整个屏幕,修改自定义View根布局的背景为白色半透明。此时如果Dialog中输入框,弹出键盘后,会导致背后的Activity被顶上去(因为背景是白色半透明,因此能看到背后的Activity)。
尝试过的解决方案有:
android:windowSoftInputMode
的值为adjustPan
或adjustResize
。windowSoftInputMode
属性失效,在Dialog中尝试添加了dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
和dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
。但是都不奏效。android:windowSoftInputMode
的值为adjustNothing
。dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
具体的原因还未分析出来。
最近遇到了Andorid客户端验证Https服务器证书的问题,所以在网上找了一些资料。
Https中的Http指的是Http协议,s指的是SSL/TLS协议。SSL/TLS协议位于Http协议和TCP协议之间,主要两点作用:
1.用于判断数据是否到达了正确的服务器或/和客户端,这主要是验证的功能。
2. 将HTTP协议的数据加密,即在TCP传输过程中时密文。
具体的细节信息请阅读参考文章。
Https验证分为单向验证和双向验证。单向验证,顾名思义,是一方验证另一方是否值得信任。如Android客户端验证服务器证书是否可信任,或者服务器验证发送请求的客户端是否值得信任。双向验证,就是双方互相验证。只有验证通过了,后续通信才能继续进行。
单向验证,以Android客户端验证服务器为例。服务器需要一份证书,作为公钥。客户端请求服务器后,服务器将证书发送给客户端。客户端从自己的信任列表中查找是否存在服务器发送的证书,如果存在,说明该服务器值得信任,继续传输数据,如果不存在,直接关闭连接。同理,服务器验证客户端的过程也是一样,只不过这次是客户端有证书,服务器没有。单向验证需要一对证书(公钥)和私钥,公钥和私钥是匹配的,即一份公钥只能匹配一份私钥,反之一样。
双向验证,需要有两对公钥和私钥。即服务器有证书1,客户端有证书2。客户端验证服务器的证书1,服务器验证客户端的证书2。只有两次验证都信任,通信才能继续,否则中断连接。
简单概述先写到这里。
#参考文章:
============================
这篇文章可以作为了解Agera
开源库的入门文章看一下,文章中也涉及到了一些源代码。
我花了一段时间学习了Agera
库,虽然与RxJava & RxAndroid
都是响应式编程库,逻辑相对于嵌套要简单,但是对我而言,RxJava & RxAndroid
理解起来要比Agera
库要简单一些。可能因为RxJava & RxAndroid
比Agera
的概念要少一些。但是Agera
库的源代码少,轻量级,专注于Android开发,可以观察一段时间再上手。
============================
参考:Google Group:Duplicated POST -request with slow request
再用Volley请求服务器时,设置的请求策略为:1
2
3
4
5//请求策略是超时时间为3秒,重试次数为0
RetryPolicy retryPolicy = new DefaultRetryPolicy(3000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
request.setRetryPolicy(retryPolicy);
queue.add(request);
重试次数为0,表示不允许Volley重试。但是抓包发现,在超时之后,volley还会再次发起相同的请求,即重试。
在网络上查了一下,发现很多人都说这是Volley本身的问题,目前还没有修复。解决方法也比较简单,代码如下:1
2
3
4
5//超时时间为0,重试次数为-1
DefaultRetryPolicy retryPolicy = new DefaultRetryPolicy(0, -1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
request.setRetryPolicy(retryPolicy);
queue.add(request);
详细的情况可以去看参考的地址。
============================
原创,转载请指明出处(http://blog.xinspace.space)。
参考:EventBus exception when proj is built - Subscriber class has no public methods called onEvent
Eclipse导出签名包,用Proguard。项目中用到了org.greenrobot.eventbus.EventBus
库,在导出过程中,遇到了如下问题:1
java.lang.RuntimeException: Unable to create application xxx.xxx.xxx.MyApplication: org.greenrobot.eventbus.i: Subscriber class xxx.xxx.xxx.MyApplication and its super classes have no public methods with the @Subscribe annotation
错误提示说订阅类没有用@Subscribe
注解的public方法,导致EventBus出错,从而导致应用出错。
但是在EventBus的订阅类中,有如下方法:1
2
3
4@Subscribe
public void onEventMainThread(MyEvent event) {
dispatchEvent(event);
}
该公用方法用于接收EventBus的事件,并且用EventBus的@Subscribe
明确注解了。这与错误提示有冲突啊。经过多番查找,终于找到了原因。
============================
原创,转载请指明出处(http://blog.xinspace.space)。
Eclipse导出签名包时,用Proguard,遇到了几个错误,下面记录一下错误和解决方法。
rt.jar
问题1 | Error:ProGuard: [MyApp] java.io.IOException: Can't read [xxxx/jdk1.8.0/jre/lib/rt.jar] (Can't process class [apple/applescript/AppleScriptEngine.class] (Unsupported class version number [52.0] (maximum 51.0, Java 1.7))) |
============================
参考:How to put space character into a string name in XML?
空格符的转义字符为 
,所以可以在strings.xml文件中添加空格符:1
<string name="test_string_with_space">  This is a line with two spaces.</string>
在这一行的开头加入了两个空格符。
============================
参考: How to fix Plugin with id ‘com.github.dcendents.android-maven’ not found. in android studio
Android Studio在编译时会报这个错误,很可能是因为当前项目所用的Gradle版本太高,比如我当时编译时的Gradle使用的是最新的支持Instant Run的版本:com.android.tools.build:gradle:2.1.0
。修改为com.android.tools.build:gradle:1.3.0
即可。
============================
从Github上下载的开源库,代码中的注释全都是乱码,在gradle编译过程中,因为乱码报错而无法安装和打包,找到了参考文章,解决了这个问题。
具体来说有2步:
1.Android Studio->File->Others Settings->Default Settings->File Encodings,在对话框中的File Encoding和Project Encoding都设置为UTF-8;
2.如果项目的Gradle的版本低于gradle2.0
,那么在module
(比如app模块)下的build.gradle
文件中加如下配置:1
2
3tasks.withType(Compile) {
options.encoding = "UTF-8"
}
如果Gradle版本大于等于gradle2.0
,那么在相应的文件中改为加入如下的配置:1
2
3tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
仅仅是tasks.withType()
的参数变化了,因为在gradle2.0
及以后Compile已经被重命名为JavaCompile
了。