41

LinearLayout を拡張するカスタム コンポーネントがあります。Layout が破棄または削除されたときに特定のステートメントを実行する必要があります。(または削除されようとしています)

1 つの方法は、アクティビティの onPause() または onDestroy() を確認し、カスタム コンポーネントのメソッドを呼び出すことです。しかし、私はそのオーバーヘッドをアクティビティから取り除きたいと思っています。レイアウトが切り離されたときにカスタムコンポーネント自体が処理できるようにします。しかし、レイアウトが削除されたときに(イベントを検出するために)オーバーライドする適切な方法が見つかりません。これを処理する方法はありますか、またはアクティビティの onPause() および onResume() メソッドを使用する必要がありますか?

4

3 に答える 3

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();
}

次に、アクティビティからカスタム コンポーネントの 1 つを追加するたびに、コンポーネントをアクティビティの内部セットに追加します。アクティビティが一時停止するたびにRemovable、そのメソッドが自動的に呼び出されます。remove

onPauseこれにより、コンポーネント自体の中で が呼び出されたときに何をするかを指定できます。ただし、自動的に呼び出されるとは限りません。そのため、アクティビティで実行する必要があります。

注:削除を実行するタイミングに応じて、onStop代わりに使用できます。onPause

于 2012-01-25T11:01:46.620 に答える