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()
}
}
阅读全文 »

Future Plan

  1. Custom Achievements
  2. Link Complete Reward of task to the inventory.
  3. Add time selector in Statistics page
  4. Custom Exp of task
  5. Better settings of creating a task.

Known Bug(v1.71.4)

  • Transparent part of the png picture may turn to black when cropping a picture.


Release Log

1.71.3/1.71.4(Released at 2020/04/16)

Minor Fixes about icon and crash report

1.71.2(Released at 2020/04/14)

Features:

  • Turkish Language (thanks İbrahim DOĞAN for helping translation)

  • Customize task card background and opacity

  • Customize the action button text of inventory item
  • Feelings Favorites
  • Feelings Search

Improvement:

  • New Icon

  • Report type support multiple languages

  • Improve UI of the Settings Page
  • Improve the method of switching theme color and language. No need to restart the app to make it work.
  • Improve the crop picture page
  • Improve UI of the select list
  • Add shop item description showing on the shop item list page

Fixed:

  • Fixed bug that achievement unlock date incorrectly showing
  • Fixed bug that shop item picture showing empty when the file deleted.
  • Not clear the status of sub-tasks after single task become overdue.
  • Fixed bug that not enough space for Difficulty Degree to show in the Task Detail Page.
  • Fixed bug that after setting overdue task to finished, completed times of the next task not plus one.
  • Fixed bug that the max coin number not showing correctly in the task default settings.
  • Make the data backup/restore page scrollable.
  • Fixed that swipe to complete task not working well when fast swiping multiple tasks.
  • Now app widgets will show the Frozen status
  • Fixed bug that the progress bar on task page showing incorrect progress sometimes

Server Fixed(2020/4/13)

  • Fixed that report function not working

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
阅读全文 »