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.

-1voto

Steel FedeX Points 291

Propriété d'extension Kotlin pour la vue afin de récupérer l'activité parente :

val View.activity: Activity?
get() {
    var ctx = context
    while (true) {
        if (!ContextWrapper::class.java.isInstance(ctx)) {
            return null
        }
        if (Activity::class.java.isInstance(ctx)) {
            return ctx as Activity
        }
        ctx = (ctx as ContextWrapper).baseContext
    }
}

0 votes

Vous pourriez remplacer les deux if avec when et le isInstance() avec !is ContextWrapper ou is Activity

0 votes

Selon @Gomino, le contexte Root aura un baseContext nul. Votre implémentation peut donc lancer une ClassCastException dans ce cas.

1 votes

Il s'agit d'une ancienne solution. Il est préférable d'utiliser la solution de @Vlad

-3voto

Sebas LG Points 637

Dans Android 7+, la vue n'a plus accès à l'activité qui l'entoure. view.getContext() ne peut plus être attribué à une activité.

Au lieu de cela, le code ci-dessous fonctionne sous Android 7+ et 6 :

private static Activity getActivity(final View view) {
    return (Activity) view.findViewById(android.R.id.content).getContext();
}

8 votes

"Dans Android 7+, la vue n'a plus accès à l'activité englobante, donc view.getContext() ne peut pas être converti en une activité" Une référence ?

0 votes

@SimpleFellow comme mentionné dans d'autres commentaires, getContext retournera probablement un ContextThemeWrapper de sorte que la vue n'a plus d'accès direct à l'activité. Au lieu de cela, vous devez rechercher récursivement dans les contextes parents jusqu'à ce que vous trouviez l'activité parent ou utiliser la méthode que j'ai fournie dans cette réponse.

-4voto

@Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { if(request.getUrl().getHost().startsWith("pay.google.com")) { Intent intent = new Intent(Intent.ACTION_VIEW, request.getUrl()) ; view.getContext().startActivity(intent) ; retourne true ; } ... ... }

2 votes

Bonjour et bienvenue sur Stack Overflow. Veuillez expliquer votre réponse au-delà de l'exemple de code ; regardez les autres réponses par exemple.

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