Techo记事帐+ 1.7.1 现已发布。本次更新包含以下内容:
- 新增一次性便利贴、同步便利贴两种桌面小工具。
- 为 Xperia 设备优化了小工具显示顺序以快速访问
- 优化了数据操作性能。
- 新增了桌面小工具的透明化效果。
更多功能与易用性改善锐意开发中。
Techo记事帐+ 的 Google Play 页面:
https://play.google.com/store/apps/details?id=org.breezesoft.techoplus
我可能前进得不快,但我决不后退
Techo记事帐+ 1.7.1 现已发布。本次更新包含以下内容:
更多功能与易用性改善锐意开发中。
Techo记事帐+ 的 Google Play 页面:
https://play.google.com/store/apps/details?id=org.breezesoft.techoplus
在 Android 中,EditText 可支持句首字母大写、词首字母大写、纯数字等数十种专门优化的输入类型。有两种方式指定输入类型。
方式一,在布局资源文件中为 EditText 控件添加属性,如:
1 2 3 |
<EditText android:id="@+id/etSample" android:inputType="textCapSentences" /> |
其中,textCapWords 表示在可能的情况下,为每个句子的首字母大写。
textCapSentences 属性的值为 0x00004001 ,textCapWords 则为 0x00002001,它们以掩码的形式制定,这些属性可通过 | 运算符组合。
方式二,在代码中动态添加或更改输入类型,如:
1 2 |
// 在可能的情况下,为每个单词的首字母大写 etSample.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS); |
更多可选的输入类型请参见官方文档:
http://developer.android.com/intl/ja/reference/android/widget/TextView.html#attr_android%3ainputType
代码与范例:
1 2 3 4 5 6 7 8 9 10 11 12 |
final View menuButton = findViewById(R.id.menuButton); PopupMenu popup = new PopupMenu(MainActivity.this, menuButton); popup.getMenuInflater().inflate(R.menu.menus, popup.getMenu()); popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { Toast.makeText(MainActivity.this, "menu clicked", Toast.LENGTH_SHORT).show(); return true; } }); popup.show(); |
说明:PopupMenu 是 Android API Level11 引入的新特性,可以在屏幕上渲染一个弹出式的菜单窗口,用于显示一些常用的操作。
代码与范例:
1 2 |
ScrollView sv = (ScrollView) layout.findViewById(R.id.ScrollViewContainingAnEditText); sv.setSmoothScrollingEnabled(true); |
说明:Android 中的 EditText 是一个相当复杂的控件,与 TextView 不同,它并不支持平滑滚动及相关的视觉反馈,不过,我们可以将其置于某个 ScrollView 内,以实现类似的效果。需要注意的是,此时由于尺寸可变, EditText 的高度和宽度即使设为 fill_parent 也不会起效,可通过 ScrollView 添加 android:fillViewport=”true” 属性解决。
Android 操作系统诞生至今业已8年,不但系统自身逐步完善,开发中的最佳实践也不断推陈出新,连 Google 官方的推荐 IDE 也从 Eclipse 变为了 Android Studio。在相当时间的预览版之后,Android Studio 终于于去年底(2014年12月8日)发布正式版。经过学习与摸索,自己的项目也都迁移至 Android Studio。
Android Studio 基于 JetBrains 开发的 IntelliJ IDEA,它提供了极为强大的上下文提示与代码补全、资源实时预览、丰富便捷的跨项目导航、内置终端界面及可靠的重构工具。Eclipse + ADT 已经成为了过去时。
Gradle 是一种比 Ant 与 Maven 等传统方式更为先进的编译工具,被整合于 Android Studio。唯一的问题是自动解决库依赖等一些特性需要网络支持,在网络环境不好的情况下反而成为了拖累。
JUnit 与 Espresso 是官方推荐的测试工具。Genymotion 是性能远超官方的模拟器(及 Intel HAXM)。不过没有对 Google Play 开发者服务提供原生支持。此外,用于代码混淆的 ProGuard 和静态代码优化的 Lint 也都是常用工具。
从 Eclipse 迁移至 Android Studio 已是大势所趋,初学者也应直接从 Android Studio 入门,从最初就避免很多不必要的问题。尽管目前网络上仍以 Eclipse 的教程居多,但谁能保证 Google 不会哪天就决定放弃支持了呢(笑)。
伴随 Techo记事帐 2.3.1 的发布,Techo 记事帐+ 也获得新版本1.5.0升级。
本次更新包含以下内容:
这次更新的主要目的是提高应用稳定性与可靠性,并改善了应用对新版本系统的兼容性。由于 Dropbox Sync API 将不再被官方支持,该功能被取消。
相比免费版本,Techo记事帐+ 进一步增加了只读模式。
至此,Techo记事帐+ 提供了以下高阶功能:
在解决了 Techo记事帐 的严重稳定性问题后,今后的重心将依然回到 Techo记事帐+ 的新功能开发。敬请期待。
Techo记事帐 的 Google Play 页面:
https://play.google.com/store/apps/details?id=org.breezesoft.techoplus
今天,Techo记事帐 2.3.1 正式发布。
本次更新包含以下内容:
这次更新的主要目的是提高应用稳定性与可靠性,并改善了应用对新版本系统的兼容性。
原计划不再为 Techo记事帐添加新功能,不过这次更新依然增加了一些呼声很高的人性化设计,进一步简化操作。另一方面,更为高阶的功能将依然仅为 Techo记事帐+ 独占。根据调研,Techo记事帐 已经能够充分满足绝大部分用户的需求。可以预见,Techo记事帐+在今后很长一段时间里将依然象征意义大于实际意义,作为 Techo记事帐 的爱用者对它的一份回馈。
尽管只是一款小巧的小众软件,Techo记事帐的日均下载量节节攀升。在加速突破20万大关后,下一个里程碑,50万次下载,会在何时实现呢?
Techo记事帐 的 Google Play 页面:
https://play.google.com/store/apps/details?id=org.breezesoft.techolite
在记事帐的应用后台收到了一条罕见的崩溃报告:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
java.lang.IllegalArgumentException: pointerIndex out of range at android.view.MotionEvent.nativeGetAxisValue(Native Method) at android.view.MotionEvent.getX(MotionEvent.java:2189) at android.support.v4.view.MotionEventCompatEclair.getX(MotionEventCompatEclair.java:32) at android.support.v4.view.MotionEventCompat$EclairMotionEventVersionImpl.getX(MotionEventCompat.java:86) at android.support.v4.view.MotionEventCompat.getX(MotionEventCompat.java:184) at android.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:1462) at android.view.View.dispatchTouchEvent(View.java:8149) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2416) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2140) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2422) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2155) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2422) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2155) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2422) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2155) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2422) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2155) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2422) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2155) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2422) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2155) at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2295) at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1622) at android.app.Activity.dispatchTouchEvent(Activity.java:2565) at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2243) at android.view.View.dispatchPointerEvent(View.java:8357) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4778) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4644) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4202) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4256) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4225) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4336) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4233) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4393) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4202) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4256) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4225) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4233) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4202) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6569) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6486) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6457) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6422) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6649) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:138) at android.os.Looper.loop(Looper.java:131) at android.app.ActivityThread.main(ActivityThread.java:5602) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) at dalvik.system.NativeStart.main(Native Method) |
经调查,发现这是 Android 的 ViewPager 的一个 bug,偶尔会在用户执行多点触控操作时发生。直到至少 Android 4.4,该问题依然存在。
解决方案也很简单,覆写 ViewPager 的 onTouchEvent 与 onInterceptTouchEvent 方法,catch 该异常即可,如下所示:
1 2 3 4 5 6 7 8 9 |
@Override public boolean onTouchEvent(MotionEvent me) { try { return super.onTouchEvent(me); } catch (IllegalArgumentException ex) { ex.printStackTrace(); } return false; } |
近日,蓝色光波过滤器升级到了 1.921,除了例行的稳定性提升,还特别加入了夜间模式支持。
夜间模式简言之,可以将屏幕亮度限制至极低的程度,确保用户在夜间无光环境下也能长时间观看手机而不会因刺眼光线感到眼睛疲劳。
夜间模式的灵感源于 Google Play Books 的夜间阅读模式,但提供了更为细致的级别选项,并能作用于设备全局。
可以从这里跳转至 Google Play 页面进行下载。