【问题标题】:How to detect if view's parent activity is being destroyed如何检测视图的父活动是否被破坏
【发布时间】:2010-06-30 08:43:36
【问题描述】:

我想在 Activity 被销毁时对视图进行一些清理。当活动被销毁时,有什么方法可以在视图中获取回调?我尝试使用onDetachedFromWindow,但我不确定这样做是否正确。

【问题讨论】:

    标签: android view callback android-activity


    【解决方案1】:

    如果您想在不重载View.onDetachedFromWindow() 方法的情况下获得回调,您可以使用View.addOnAttachStateChangeListener() 方法,该方法将回调监听器作为单个参数。

    【讨论】:

      【解决方案2】:

      了解不保证会调用 onDestroy,您可以在活动的 onDestroy 方法中回调到您的视图中。

      编辑以回应评论: 您可以通过在布局中给它一个 id 并调用 findViewById 来获取任何视图。这是一个例子:

      Layout.xml(仅显示最低限度)

      <LinearLayout>
        <com.example.superwidget.DropDownTouchEnabledListView
          android:id="@+id/special_list_view" />
      </LinearLayout>
      

      MyActivity.java(同样,最小化并假设正确导入)

      @Override
      void onDestroy() {
          DownTouchEnabledListView v = (DownTouchEnabledListView)findViewById(R.id.special_list_view);
          v.doCallback(with, parameters);
      }
      

      【讨论】:

      • 你能详细说明一下吗。我的自定义视图类是单独包的一部分,此视图在布局 xml 中定义。因此,从活动类中调用视图中的某些内容是不可行的。
      • “所以从活动类中调用视图中的某些东西是不可行的。”就是这样。调用findViewById(),获取小部件,将其转换为适当的类,并在其上调用方法。话虽如此,onDetachedFromWindow() 对我来说似乎是一个合理的选择。
      • @CommonsWare 你评论的速度比我编辑的快。 :) 顺便说一句,感谢您所做的所有工作。您的书籍/代码/答案对我来说非常宝贵。
      • @CommonWare:我正在编写一个具有自定义视图的库,而不是编写一个 android 应用程序。所以我无法控制 Activity 类代码。
      • @bhups:在这种情况下,请坚持使用onDetachedFromWindow(),除非它会引起问题。
      【解决方案3】:

      由于View 包含Context,我为此使用LocalBroadcastManager。到目前为止,我还没有遇到任何问题。

      View 正在收听destroy event filterActivity 然后只需要广播destroy event

      // On View `setup` function
      LocalBroadcastManager.getInstance(context).registerReceiver(receiver, filter)
      
      // On Activity
      override fun onDestroy() {
          super.onDestroy()
          LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
      }
      

      一旦销毁事件被触发,不要忘记取消注册event filter

      presenter.destroy() // Your clean-up code here
      LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver)
      

      您可以在此处找到有关LocalBroadcastManager 的更多详细信息:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-08
        • 1970-01-01
        • 1970-01-01
        • 2020-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多