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

Posted

技术标签:

【中文标题】在Android中销毁布局时覆盖的方法【英文标题】:Method to override when layout is destroyed in Android 【发布时间】:2012-02-18 13:21:43 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

我成功地覆盖了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

【讨论】:

当从 ViewGroup 中删除 View 时也会调用这些方法吗?还是仅来自窗口(例如主要活动 ContentView)?据我在 ViewGroup 和 View 代码中阅读,这不是。 这个答案也具有误导性,使用后退按钮时会调用“onDetachedFromWindow”,但使用主页按钮时不会调用。使用此方法,当用户使用主页按钮退出应用程序时,自定义组件不会“暂停”。 这个答案也有一些很好的例子:***.com/a/38966832/2614353【参考方案2】:

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

@Override
void onViewDetachedFromWindow(View v) 
 doCleanup();

【讨论】:

android 5.0+ 上,当我们在 onViewDetachedWindow 清理我们的组件时,视图的属性为空。可以用什么来代替 onViewDetachedWindow? @quick release : 可能是你在'super.onDetachedFromWindow();'之后调用'doCleanup()'【参考方案3】:

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

但如果你真的想将你的组件绑定到那个生命周期,我建议你的组件实现一个接口(类似于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 时要执行的操作。但它不能确保它被自动调用,因为你必须在 Activity 中执行它。

注意:您可以使用onStop 代替onPause,具体取决于您希望何时进行删除。

【讨论】:

抱歉,虽然这个建议在应用到 数据对象 时在某种抽象意义上可能通常是可以的,但它在几乎所有可以想象为一般建议的方面都具有误导性和不正确性。如果您可以将生命周期与附加/分离事件结合起来,那么这正是 OP 所建议的逻辑所属的地方。仅当您的对象需要与附加/分离不同的生命周期时,让活动处理事物才有意义。另外,当根视图附加/分离时,Activity 会从 WindowManager 公开回调,而您没有提及。

以上是关于在Android中销毁布局时覆盖的方法的主要内容,如果未能解决你的问题,请参考以下文章

Android之相对布局

在 Android Studio Gutter 中启用代码覆盖率指示

android开发怎样让悬浮Activity只是隐藏而不销毁

Android 线性布局覆盖 onSaveInstanceState

Android 软键盘弹出时布局内指定内容上移实现及问题解决

布局问题 - 无法在 android 中正确创建布局