J'ai un composant personnalisé qui étend LinearLayout, j'ai besoin d'exécuter certaines instructions lorsque Layout est détruit ou supprimé. (ou sur le point d'être supprimé)
Une façon consiste à vérifier onPause () ou onDestroy () d'une activité et d'appeler les méthodes du composant personnalisé. Mais je veux supprimer cette surcharge de l'activité. Ainsi, ce composant personnalisé lui-même peut gérer lorsque la disposition est détachée. Mais je ne trouve pas la méthode appropriée pour remplacer (pour détecter l'événement) lorsque la mise en page est supprimée. Existe-t-il un moyen de gérer cela, ou devons-nous utiliser la méthode d'activité onPause () et onResume ()?
Il est dangereux de compter sur la "destruction" d'une mise en page pour exécuter des instructions, car vous ne contrôlez pas directement le moment où cela se produit. La méthode acceptée et les bonnes pratiques consistent à utiliser le cycle de vie de l'activité pour cela.
Mais si vous voulez vraiment lier votre composant à ce cycle de vie , je suggère que votre composant implémente une interface (quelque chose comme Removable
), et faites quelque chose comme ça dans votre classe d'activité de base (que toutes vos activités s'étendent):
protected Set<Removable> myRemovableItems = new HashSet<Removable>();
@Override
public void onPause() {
super.onPause();
for (Removable removable : myRemovableItems) {
removable.remove();
}
}
L'interface:
public interface Removable {
void remove();
}
Ensuite, chaque fois que vous ajoutez l'un de vos composants personnalisés à partir d'une activité, vous ajoutez le composant à l'ensemble interne de Removable
de l'activité et sa méthode remove
sera automatiquement appelée à chaque fois que l'activité est en pause.
Cela vous permettrait de spécifier quoi faire lorsque onPause
est appelé dans le composant lui-même. Mais cela ne garantirait pas qu'il soit automatiquement appelé , pour cela, vous devrez le faire dans l'activité.
Remarque: vous pouvez utiliser onStop
au lieu de onPause
selon le moment où vous souhaitez que la suppression se produise.
J'ai réussi à remplacer les méthodes onAttachedToWindow()
et 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
}
Vous pouvez demander à votre vue personnalisée d'écouter ses propres événements. Je suggère d'utiliser View.OnAttach State ChangeListener et d'écouter l'événement onDetach.
@Override
void onViewDetachedFromWindow(View v) {
doCleanup();
}