web-dev-qa-db-fra.com

Méthode pour remplacer lorsque la mise en page est détruite dans Android

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 ()?

37
sat

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.

6
Guillaume

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

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