我有一个扩展 LinearLayout 的自定义组件,当 Layout 被销毁或删除时,我需要执行某些语句。(或即将被删除)
一种方法是检查活动的 onPause() 或 onDestroy() 并调用自定义组件的方法。但我想从活动中消除这种开销。这样自定义组件本身就可以在布局分离时处理。但是当布局被删除时,我会找到合适的方法来覆盖(检测事件)。有没有办法处理这个问题,或者我们需要使用 onPause() 和 onResume() 活动方法?
我有一个扩展 LinearLayout 的自定义组件,当 Layout 被销毁或删除时,我需要执行某些语句。(或即将被删除)
一种方法是检查活动的 onPause() 或 onDestroy() 并调用自定义组件的方法。但我想从活动中消除这种开销。这样自定义组件本身就可以在布局分离时处理。但是当布局被删除时,我会找到合适的方法来覆盖(检测事件)。有没有办法处理这个问题,或者我们需要使用 onPause() 和 onResume() 活动方法?
我成功地覆盖了onAttachedToWindow()
andonDetachedFromWindow()
方法:
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
// View is now attached
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
// View is now detached, and about to be destroyed
}
你可以让你的自定义视图监听它自己的事件。我建议使用View.OnAttachStateChangeListener并监听 onDetach 事件。
@Override
void onViewDetachedFromWindow(View v) {
doCleanup();
}
依靠布局的“破坏”来执行语句是危险的,因为您无法直接控制何时发生这种情况。公认的方式和良好做法是为此使用活动的生命周期。
但是,如果您真的想将您的组件绑定到该生命周期,我建议您的组件实现一个接口(类似于Removable
),并在您的基本活动类中执行类似的操作(您的所有活动都扩展):
protected Set<Removable> myRemovableItems = new HashSet<Removable>();
@Override
public void onPause() {
super.onPause();
for (Removable removable : myRemovableItems) {
removable.remove();
}
}
界面:
public interface Removable {
void remove();
}
然后,每次您从活动中添加一个自定义组件时,您将该组件添加到活动的内部集合中,并且每次活动暂停时都会自动调用Removable
其方法。remove
这将允许您指定onPause
在组件本身内调用时要执行的操作。但它不能确保它被自动调用,因为你必须在活动中这样做。
注意:您可以使用onStop
而不是onPause
取决于您希望何时进行删除。