web-dev-qa-db-ja.com

Androidでレイアウトが破棄されたときにオーバーライドするメソッド

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

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

37
sat

ステートメントを実行するためにレイアウトの「破壊」に依存することは危険です。なぜなら、それがいつ起こるかを直接制御できないからです。受け入れられている方法と良い方法は、そのためにアクティビティのライフサイクルを使用することです。

ただし、コンポーネントをそのライフサイクルに本当に結び付けたい場合、コンポーネントにインターフェース(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を使用できます。

6
Guillaume

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
}
74
JesperB

カスタムビューに独自のイベントをリッスンさせることができます。 View.OnAttach State ChangeListener を使用し、onDetachイベントをリッスンすることをお勧めします。

@Override
void onViewDetachedFromWindow(View v) {
 doCleanup();
}
9
Pedro Loureiro