在Android中销毁布局时覆盖的方法

sat*_*sat 37 android view activity-lifecycle

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

一种方法是检查活动的onPause()或onDestroy()并调用自定义组件的方法.但我想从活动中删除这些开销.因此,自定义组件本身可以在分离布局时进行处理.但我发现删除布局时找到合适的方法来覆盖(检测事件).有没有办法处理这个,或者我们需要使用onPause()和onResume()方法的活动?

Jes*_*erB 75

我成功地覆盖了这些onAttachedToWindow()onDetachedFromWindow()方法:

@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
}
Run Code Online (Sandbox Code Playgroud)


Ped*_*iro 9

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

@Override
void onViewDetachedFromWindow(View v) {
 doCleanup();
}
Run Code Online (Sandbox Code Playgroud)


Gui*_*ume 6

依靠布局的"破坏"来执行语句是危险的,因为你不能直接控制何时发生这种情况.公认的方法和良好做法是使用活动的生命周期.

但是如果你真的想把你的组件绑定到那个生命周期,我建议你的组件实现一个接口(类似的东西Removable),并在你的基本活动classe(你的所有活动扩展)中做类似的事情:

protected Set<Removable> myRemovableItems = new HashSet<Removable>();

@Override
public void onPause() {
    super.onPause();
    for (Removable removable : myRemovableItems) {
        removable.remove();
    }
}
Run Code Online (Sandbox Code Playgroud)

界面:

public interface Removable {
    void remove();
}
Run Code Online (Sandbox Code Playgroud)

然后,每次从活动中添加一个自定义组件时,都会将该组件添加到活动的内部集合中Removable,并且remove每次暂停活动时都会自动调用其方法.

这将允许您指定onPause在组件本身内调用时要执行的操作.但它不能确保它被自动调用,因为你必须在活动中这样做.

注意:您可以使用onStop而不是onPause取决于您希望何时进行删除.