213 votes

Comment obtenir l'activité d'hébergement à partir d'une vue ?

J'ai un Activity avec 3 EditText et d'une vue personnalisée qui fait office de clavier spécialisé pour ajouter des informations dans la fenêtre EditText s.

Actuellement, je passe le Activity dans la vue afin que je puisse obtenir le texte d'édition actuellement ciblé et mettre à jour le contenu à partir du clavier personnalisé.

Existe-t-il un moyen de référencer l'activité mère et d'obtenir l'activité en cours ? EditText sans passer l'activité dans la vue ?

7 votes

La bonne réponse est de gomino.

341voto

gomino Points 2693

Je viens d'extraire le code source du MediaRouter dans la section bibliothèque officielle de soutien et jusqu'à présent, cela fonctionne bien :

private Activity getActivity() {
    Context context = getContext();
    while (context instanceof ContextWrapper) {
        if (context instanceof Activity) {
            return (Activity)context;
        }
        context = ((ContextWrapper)context).getBaseContext();
    }
    return null;
}

18 votes

Pendant ? Pourquoi pendant ?

19 votes

C'est juste un moyen de remonter à travers tous les contextes de base, jusqu'à ce que l'activité soit trouvée, ou de sortir de la boucle lorsque le contexte racine est trouvé. Car le contexte racine aura un baseContext nul, ce qui conduira à la fin de la boucle.

1 votes

Très bien ! J'ai remplacé ((Activity) getContext()) par getActivity() et ça marche bien..... Merci

174voto

becomputer06 Points 5806

Les méthodes suivantes peuvent vous aider

  1. Activity host = (Activity) view.getContext() ; et
  2. view.isFocused()

39 votes

N'oubliez pas que getContext() ne renvoie pas toujours un objet Activity si votre vue n'est pas appelée depuis un contexte Activity. Assurez-vous de prévoir cela à l'avance et de fournir une solution de rechange appropriée.

1 votes

@WordPressDeveloper - Comment créer une vue sans activité ? Vous voulez dire une vue distante ? Y a-t-il d'autres cas de vues qui sont créées en dehors d'une activité ?

1 votes

@kilaka Les widgets, les fragments, les RemoteViews, les LayoutInflaters sont autant de cas où vous pouvez créer une vue qui n'est pas liée à une activité.

46voto

V. Kalyuzhnyu Points 1515

MISE À JOUR

tailrec fun Context.getActivity(): Activity? = this as? Activity
    ?: (this as? ContextWrapper)?.baseContext?.getActivity()

grâce à @Westy92

Utilisation :

context.getActivity()

2 votes

Merci, j'apprécie vraiment cette belle activité de scan sur kotlin

6 votes

Vous pouvez aussi le faire : tailrec fun Context?.getActivity(): Activity? = this as? Activity ?: (this as? ContextWrapper)?.baseContext?.getActivity()

10voto

brownieGirl Points 101

J'ai pris Gomino 's réponse et je l'ai modifié pour qu'il s'intègre parfaitement dans myUtils.java afin de pouvoir l'utiliser partout et à tout moment. J'espère que quelqu'un le trouvera utile :)

abstract class myUtils {
    public static Activity getActivity(View view) {
        Context context = view.getContext();
        while (context instanceof ContextWrapper) {
            if (context instanceof Activity) {
                return (Activity)context;
            }
            context = ((ContextWrapper)context).getBaseContext();
        }
        return null;
    }
}

1 votes

Ce n'est pas une réponse efficace, car il y a des chances que cette fonction renvoie un résultat nul. Ma réponse est universellement applicable, bien qu'il faille travailler dur et comprendre : stackoverflow.com/a/51077569/787399

2voto

Kidburla Points 570

Je veux juste noter que, si vous savez que votre vue est à l'intérieur d'une Fragment vous pouvez le faire :

FragmentManager.findFragment(this).getActivity();

Appelez-le depuis votre onAttachedToWindow o onDraw vous ne pouvez pas l'appeler plus tôt (par ex. onFinishInflate ) ou vous obtiendrez une exception.

Si vous n'êtes pas sûr que votre vue se trouve à l'intérieur d'un fichier de type Fragment puis se référer à d'autres réponses, par exemple Gomino, je voulais juste le dire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X