【发布时间】:2014-01-08 15:16:08
【问题描述】:
我已经实现了一个从 ViewGroup 扩展的自定义 View 组件。我已经重写了 onTouchEvent 方法来监听 MotionEvent 事件。我基本上要做的是,如果用户用手指(MotionEvent.ACTION_UP)触摸并释放我的自定义视图,则包含我的视图的活动将完成。我的自定义视图引用了活动。
到目前为止一切顺利,我唯一遇到的问题是方向变化,情况如下:
- 用户触摸我的视图(手指放在我的视图上)
- 用户旋转设备(手指仍在我的视野中)
-
MotionEvent.ACTION_UP将被识别,这是由方向更改和新 Activity 的重新创建引起的(方向更改将重新创建旋转的 Activity) - 由于我在处理
MotionEvent.ACTION_UP时调用了 activity.finish(),因此将抛出 IllegalStateException,因为旧的活动已经被销毁,然后我再次调用了 finish()(在处理 MotionEvent 时)。
知道如何处理这个问题。我曾尝试使用onDetachFromWindow,但这似乎为时已晚。我可以使用另一种方法/回调吗?我想为我的视图创建一个小型库,因此我不想使用Activity.onDestroy(),因为我想避免调用我的视图的方法,以通知活动已被破坏。
从 API 级别 17 开始,有一个方法 Activity.isDestroyed()。这将是解决我的问题的解决方案,但我也必须支持旧版本(回到 Android 8)。 Activity.isFinishing() 可以工作,但我想介绍更一般的活动被破坏的情况(因为我的库的用户可以实现自己的 ACTION_UP 回调,他可以调用Activity.onBackPressed() 而不是调用Activity.finished()。有什么建议吗?
【问题讨论】: