我有一个扩展LinearLayout的自定义组件,我需要在销毁或删除Layout时执行某些语句。 (或即将被删除)
一种方法是检查活动的onPause()或onDestroy()并调用自定义组件的方法。但我想从活动中删除这些开销。 因此,自定义组件本身可以在分离布局时进行处理。但我发现删除布局时找到合适的方法来覆盖(检测事件)。有没有办法处理这个,或者我们需要使用onPause()和onResume()活动方法?
答案 0 :(得分:73)
我成功覆盖了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
}
答案 1 :(得分:9)
您可以让自定义视图收听自己的活动。我建议使用View.OnAttachStateChangeListener并听取onAttach事件。
@Override
void onViewDetachedFromWindow(View v) {
doCleanup();
}
答案 2 :(得分:5)
依靠布局的“破坏”来执行语句是危险的,因为你不能直接控制何时发生这种情况。接受的方式和良好做法是使用活动的生命周期。
但是如果你真的想将你的组件绑定到生命周期,我建议你的组件实现一个接口(类似Removable
),并在你的基本活动classe中做类似的事情(你的所有活动都延伸了):
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
,具体取决于您希望删除的时间。