A Blog to Write about Everything

0%

设置软键盘弹出,自动上移

1
2
3
4
5
6
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
...
// 设置有软键盘时,窗口自动上移
dialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
...
}

设置全屏显示

1
2
3
4
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NORMAL, R.style.Dialog_FullScreen)
}
1
2
3
4
5
<style name="Dialog.FullScreen" parent="Theme.AppCompat.Dialog">
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@color/transparent</item>
<item name="android:windowIsFloating">false</item>
</style>

子Fragment

1
2
3
4
5
private fun replace(fragment: androidx.fragment.app.Fragment) {
val transaction = childFragmentManager.beginTransaction()
transaction.replace(R.id.fragment, fragment)
transaction.commit()
}
阅读全文 »

ValueAnimator 实现TextView打字机效果

1
2
3
4
5
6
7
8
9
10
11
fun TextView.startTypeAnimation(duration: Long = 300) {
val originText = this.text
val valueAnimator = ValueAnimator.ofInt(0, originText.length)
valueAnimator.duration = duration
valueAnimator.interpolator = LinearInterpolator()
valueAnimator.addUpdateListener { animation ->
val length = animation.animatedValue as Int
this.text = originText.subSequence(0, length)
}
valueAnimator.start()
}

SpringInterpolator 简易的弹性插值器

1
2
3
4
5
6
7
8
/**
* 弹性插值器
*/
class SpringInterpolator(private val factor: Float) : Interpolator {
override fun getInterpolation(input: Float): Float {
return (2.0.pow((-10 * input).toDouble()) * sin((input - factor / 4) * (2 * Math.PI) / factor) + 1).toFloat()
}
}
阅读全文 »

Known Bug

  • When getting achievement reward, unlock date is incorrect (always 2019/11/16)

    You can re-enter the achievement page to check the correct date.

    The bug will be fixed next version.

  • Sensitive word filter not working well with English.


Release Log

v1.71.1 (Released at 2020/03/17)

Improvement:

  • Better progress bar animation in task page

Fixed:

  • Fixed a bug that may cause crash when launching application on some devices
  • Fixed a bug about selecting photos
阅读全文 »

简介

后台监测到了数个仅限于Android5的崩溃问题,日志大概如下:

1
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.ViewParent android.view.View.getParent()' on a null object reference at android.view.ViewOverlay$OverlayViewGroup.add(ViewOverlay.java:164) at android.view.ViewGroupOverlay.add(ViewGroupOverlay.java:63) at android.app.EnterTransitionCoordinator.startRejectedAnimations(EnterTransitionCoordinator.java:598) at android.app.EnterTransitionCoordinator.startSharedElementTransition(EnterTransitionCoordinator.java:325) at android.app.EnterTransitionCoordinator.access$200(EnterTransitionCoordinator.java:42) at android.app.EnterTransitionCoordinator$5$1.run(EnterTransitionCoordinator.java:389) at android.app.ActivityTransitionCoordinator.startTransition(ActivityTransitionCoordinator.java:698) at android.app.EnterTransitionCoordinator$5.onPreDraw(EnterTransitionCoordinator.java:386) at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:847) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1985) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1077) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5845) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) at android.view.Choreographer.doCallbacks(Choreographer.java:580) at android.view.Choreographer.doFrame(Choreographer.java:550) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5272) at java.lang.reflect.Method.invoke(Method.java) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)

查了下资料,发现这是 Android 5.0 系统的内置Bug。

在执行切换动画的时候,有一定条件下会导致崩溃问题。

并且,在 API level 22(即 Android 5.1)之后,这个 bug 已经被修复了。

最简单也是最有效的解决方法:

只有在API level 22的情况下,再执行切换动画。

其他

也有一些想要在 Android 5.0 继续使用切换动画,避免崩溃的解决方案。

这个 Android 系统 bug 与分享元素的选取排除(’rejected’)的处理有关。如果一个分享元素在执行动画的时候没有 attached to the window 就有可能被拒绝,也就是当 View 可见性为 GONE 的时候。

所以,解决方法就是在执行切换动画的时候,检查每一个共享元素View,并且将可见性改为 VISIBLE

Glenn Schmidt

参考

https://stackoverflow.com/questions/34658911/entertransitioncoordinator-causes-npe-in-android-5-0

这里会讲解事项相关的内容~

目录(施工中)

  1. 建立事项
    1.1 设置介绍

▌新建事项

设置介绍

重复频次

艾宾浩斯记忆法的时间表

依次重复频率为当天→1天后→2天后→4天后→7天后→15天后→30天后


设置忽略日(每周几)

设置重复频率为每日之后,会出现一个设置忽略的按钮。


完成奖励

其实这是实现商店功能前的替代品。

设置奖励之后,「经验值弹窗」会展示奖励内容。


目标重复次数

仅适用于重复事项

设置你想进行重复事项的目标次数,达到目标后,事项会自动终止。

比如你想立个小目标,坚持30天学外语。

那么,可以设置一个重复频次为每日,目标重复次数为30的待办事项。

进行该设置的事项,会在事项内容后面显示进度(当前次数/目标次数)


计数事项

点击事项类型可以将事项设置为「计数事项」。

计数事项会在你点击「完成小圆圈」的时候,弹框让你记录完成次数。
只有达到或超过了目标次数,才会标记为「完成状态」。
如果还没有达到,则会帮你记录目前进度。

使用场景:

  • 每天背诵30个单词(重复频次设为每日,计数目标次数设为30
  • 每周完成4次打扫卫生(重复频次设为每日,计数目标次数设为30

例子

人升的事项依靠着开始时间、期限时间和重复频次的配合,可以建立出各种复杂情况的待办事项。

以下是一些情况的例子:


1. 普通待办事项/琐事/购物清单

这种类型的事项,不需要关心“期限时间”,重复频次默认也是“单次”。

所以,不需要额外设置。只需要填好“待办事项”内容即可。


2. 习惯养成(每日早起、每周跑步等)

调整“重复频次”为相应的“每日”或者“每周”后,再根据情况看要不要调整“期限日期”

当“重复频次”不为“单次”的情况下,期限日期会默认为“当天”。

对于“每日”事项来说,这样设置一般是合理的。

而对于重复频次大于“每日”的事项,要根据具体情况调整期限:

  1. 比如1号的时候建立“每周”事项,不改期限日期。那么下一次的事项的时间会在2-8号。
  2. 如果你调整期限日期到2号。那么下一次的事项时间就会在3-9号。(相当于延后一天)


3. 每周一-每周日

通过期限时间和重复频次的配合,你能轻松地设置出“星期一”到“星期日”的每周事项。

只要设置重复频次为“每周”,然后期限时间设置为“周末”即可~。

人升弱化了开始时间的概念,在绝大多的时候可以让相应的开始时间自动计算得出。


4. 当天23:00-第二天2:00

通过开始时间、期限时间和重复频次的配合,你能轻松地设置出情况很复杂的待办事项。

只需要设置开始时间为具体的“当天23:00”,期限时间为具体的“第二天2:00”重复频次为“每日”即可。


5. 指定每周几(仅工作日、仅周末等)

设置“重复频次”为“每日”后,在“重复频次”的输入框右侧点击“设置忽略”。然后就能指定每周几重复了。


6. 坏习惯惩罚

虽然《人升》并没有专门的「坏习惯」板块,但其实是支持经验值/金币惩罚的(可以在自定义设置中更改惩罚系数,金币默认为不惩罚)。

要实现坏习惯惩罚的效果的话,只需要逆向创建事项即可。


比如:

你想当自己「贪食」的时候,给予自己惩罚。

那么,完全可以创建一个“每日坚持不贪食”的待办事项。

当你犯错的时候,只要不完成这个事项,或者直接放弃当天这个事项就能接受惩罚了。


▌清单管理

清单分类

告示板界面右上角,可以点击第一个按钮(即清单按钮),进入选择清单界面。

在这里可以:

  • 切换清单

    直接点击列表项即可

  • 新建/重命名清单

    所有清单不支持重命名

  • 删除清单

    只有在清单为空的时候,才能进行删除操作


默认清单不可删除,但可以重命名。

所有清单会显示所有清单的待办事项,该清单也是不可删除的,并且不可重命名。

筛选排序

告示板界面右上角,点击最右侧的按钮(即更多选项按钮),可以进行筛选排序设置。

如果你偏好于隐藏未开始的事项,可以在这里选择显示今天事项

这个选项会只显示今天已经开始或将于今天某个时刻开始的事项。


自定义排序

长按即可拖动待办事项卡片进行排序。


▌稍后阅读

《人升》可以接受其他应用分享过来的信息,用以快速建立「稍后阅读」事项。并且默认会勾选“学识”属性。

支持大部分提供分享功能的应用:如“微博”、“知乎”、“浏览器”、“Twitter”等。

大家好~欢迎查阅本次更新日志。

v1.70.1的版本已经于2月14号发布了,修复了v1.70.0的数个问题。遇到一些奇怪的问题的用户可以升级下版本。

今年以来,「人升」陆续地登上了更多的应用市场:应用宝、华为应用市场、豌豆荚、360应用市场、UC等。

现在可以在上述的一些平台进行应用更新了。

(之前仅登录了酷安、小米、魅族、Google Play市场。华为应用市场的之前被侵权了,这次也靠着大家的举报和申诉成功拿回来了管理权)

本文会简单介绍各个新功能,以及其使用方法。

比如讲解了如何用坚果云做WebDAV备份。

总览

  1. 简洁模式

  2. 图片附件

  3. WebDAV备份

  4. 自定义属性

  5. 更多改进

    5.1 “撤销”功能优化

    5.2 动态显示效果优化

  6. 详细更新日志

阅读全文 »

上周六已经发布了本次1.69.0的更新。

更新内容覆盖面较广,本以为会出现很多问题,现在看来还好~

因为更新比较匆忙,当时没写更新介绍,现在补上。

有的更新内容不看更新日志不容易察觉,比如团队事项编辑的开放。

这次更新的主题是加强实用性,增强各个功能模块

开始正题之前,先发下这篇文章的总览:

总览

  1. 子任务

  2. 逾期处理

  3. 自定义排序以及菜单重制

  4. 桌面小部件升级

  5. 更多改进

    5.1 冻结

    5.2 编辑团队事项

  6. 详细更新日志

阅读全文 »

这个系列好久没更新了(离目标日渐遥远

这段时间的开发其实遇到了不少问题,不过都没及时记录导致最后也忘记了。

这里记一下新鲜的优化遇到的坑吧。

桌面小部件

之前匆忙写的桌面小部件是不支持分别显示不同清单的,并且还只能显示“所有”。

需要实现在桌面小部件,点击可以直接选择清单。

这里选择了透明Activity+BottomSheetDialog的方案,看上去没打开应用就进行了选择。

实现清单选择功能

第一步:实现透明Activity

透明Style(其实是历史代码):

1
2
3
4
5
6
7
8
9
10
<style name="Transparent_Activity" parent="AppTheme.NoActionBar">
<item name="android:windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowDisablePreview">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:backgroundDimEnabled">false</item>
</style>

并且这个Activity应该是独立栈,所以将启动模式设置为singleInstance

并且在Activity处理Intent传递过来的appWidgetId参数,实现清单选择。

阅读全文 »

欢迎更新到v1.68.0~

这个版本可能是比肩商店系统的一次重要更新。

首先是实现了远比之前版本完善的成就系统,其次也更新了日历视图,各个页面也有大大小小的优化。

开始正题之前,先发下这篇文章的总览:

总览

  1. 全新的成就系统,56种成就。
  2. 日历视图
  3. 金币详情
  4. 历史页面
  5. 其他改进
  6. To Do
阅读全文 »