41

我有一个扩展 LinearLayout 的自定义组件,当 Layout 被销毁或删除时,我需要执行某些语句。(或即将被删除)

一种方法是检查活动的 onPause() 或 onDestroy() 并调用自定义组件的方法。但我想从活动中消除这种开销。这样自定义组件本身就可以在布局分离时处理。但是当布局被删除时,我会找到合适的方法来覆盖(检测事件)。有没有办法处理这个问题,或者我们需要使用 onPause() 和 onResume() 活动方法?

4

3 回答 3

81

我成功地覆盖了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
}
于 2013-05-24T14:52:36.990 回答
9

你可以让你的自定义视图监听它自己的事件。我建议使用View.OnAttachStateChangeListener并监听 onDetach 事件。

@Override
void onViewDetachedFromWindow(View v) {
 doCleanup();
}
于 2012-01-25T11:26:53.547 回答
6

依靠布局的“破坏”来执行语句是危险的,因为您无法直接控制何时发生这种情况。公认的方式和良好做法是为此使用活动的生命周期

但是,如果您真的想将您的组件绑定到该生命周期,我建议您的组件实现一个接口(类似于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取决于您希望何时进行删除。

于 2012-01-25T11:01:46.620 回答