LinearLayoutを拡張するカスタムコンポーネントがあり、レイアウトが破棄または削除されたときに特定のステートメントを実行する必要があります。 (または削除されようとしている)
1つの方法は、アクティビティのonPause()またはonDestroy()を確認し、カスタムコンポーネントのメソッドを呼び出すことです。しかし、アクティビティからそのオーバーヘッドを削除したいと思います。そのため、カスタムコンポーネント自体は、レイアウトが切り離されたときに処理できます。しかし、レイアウトが削除されたときに(イベントを検出するために)オーバーライドする適切なメソッドを見つけました。これを処理する方法はありますか、またはアクティビティのonPause()およびonResume()メソッドを使用する必要がありますか?
ステートメントを実行するためにレイアウトの「破壊」に依存することは危険です。なぜなら、それがいつ起こるかを直接制御できないからです。受け入れられている方法と良い方法は、そのためにアクティビティのライフサイクルを使用することです。
ただし、コンポーネントをそのライフサイクルに本当に結び付けたい場合、コンポーネントにインターフェース(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
を使用できます。
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
}
カスタムビューに独自のイベントをリッスンさせることができます。 View.OnAttach State ChangeListener を使用し、onDetachイベントをリッスンすることをお勧めします。
@Override
void onViewDetachedFromWindow(View v) {
doCleanup();
}