Maison développement back-end Tutoriel XML/RSS Partage de cas lors de la définition d'événements de clic pour la présentation Afficher dans XML

Partage de cas lors de la définition d'événements de clic pour la présentation Afficher dans XML

Mar 17, 2017 pm 05:25 PM

Il est courant de configurer un événement de surveillance des clics pour une vue, telle que

    view.setOnClickListener(onClickListener);
Copier après la connexion

Une autre façon consiste à le spécifier directement dans le XML disposition Pour la méthode de rappel lorsque vous cliquez sur la vue, vous devez d'abord écrire la méthode de rappel dans l'activité, telle que

    public void onClickView(View view){
        // do something
    }
Copier après la connexion

, puis définir l'attribut android:onClick de la vue en XML

    <View
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:onClick="onClickView" />
Copier après la connexion

Parfois, il est plus pratique de définir des événements de clic directement à partir de la mise en page XML (en particulier lors de l'écriture de projets DEMO). Peu de gens utilisent généralement cette méthode. Vous pouvez le deviner à peu près. la méthode d'utilisation. La vue doit utiliser la réflexion pour trouver la méthode "onClickView" de l'activité et l'appeler lorsqu'elle est en cours d'exécution, car cette approche n'utilise aucune interface.

Ensuite, nous pouvons analyser comment View déclenche la méthode de rappel à partir du code source.

Partage de cas lors de la définition d'événements de clic pour la présentation Afficher dans XML
View a 5 méthodes de construction . La première est utilisée en interne. La deuxième méthode est généralement utilisée pour créer directement des instances de View dans le code Java. à partir de la mise en page XML appellera éventuellement la cinquième méthode.

public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        this(context);

        final TypedArray a = context.obtainStyledAttributes(
                attrs, com.android.internal.R.styleable.View, defStyleAttr, defStyleRes);
                
        for (int i = 0; i < N; i++) {
            int attr = a.getIndex(i);
            switch (attr) {
                ……
                // 处理onClick属性
                case R.styleable.View_onClick:
                    if (context.isRestricted()) {
                        throw new IllegalStateException("The android:onClick attribute cannot "
                                + "be used within a restricted context");
                    }

                    final String handlerName = a.getString(attr);
                    if (handlerName != null) {
                        // 给当前View实例设置一个DeclaredOnClickListener监听器
                        setOnClickListener(new DeclaredOnClickListener(this, handlerName));
                    }
                    break;
                }
        }
}
Copier après la connexion

Lors du traitement de l'attribut onClick, déterminez d'abord si le contexte de la vue est restreint, et si c'est le cas, lancez une IllegalStateException. Jetez un œil à la méthode isRestricted

    /**
     * Indicates whether this Context is restricted.
     *
     * @return {@code true} if this Context is restricted, {@code false} otherwise.
     *
     * @see #CONTEXT_RESTRICTED
     */
    public boolean isRestricted() {
        return false;
    }
Copier après la connexion

isRestricted est utilisé pour déterminer si l'instance de Context actuelle est dans un état restreint. Selon l'explication officielle, un Context dans un état restreint ignorera certaines fonctionnalités, telles que. as Certains attributs de XML, évidemment l'attribut android:onClick que nous examinons, sont également ignorés.

un contexte restreint peut désactiver des fonctionnalités spécifiques. Par exemple, une vue associée à un contexte restreint ignorerait des attributs XML particuliers.

Cependant, la méthode isRestricted en fait partie. les quelques-uns dans Context Il existe de nombreuses méthodes d'implémentation concrètes (les autres sont essentiellement des méthodes abstraites), ici renvoient directement false, et cette méthode n'est remplacée que dans ContextWrapper et MockContext
Partage de cas lors de la définition d'événements de clic pour la présentation Afficher dans XML

public class ContextWrapper extends Context {
    Context mBase;
    @Override
    public boolean isRestricted() {
        return mBase.isRestricted();
    }
}

public class MockContext extends Context {
    @Override
    public boolean isRestricted() {
        throw new UnsupportedOperationException();
    }
}
Copier après la connexion

ContextWrapper C'est aussi juste que l'agent appelle isRestricted de mBase, et MockContext n'est utilisé que lors de l'écriture de tests unitaires, donc isRestricted ici ne retournera fondamentalement que false, à moins qu'un ContextWrapper personnalisé ne soit utilisé et que isRestricted soit réécrit.
Revenez à View, puis final String handlerName = a.getString(attr); obtient en fait la android:onClick="onClickView" chaîne de "onClickView" dans , puis utilise l'instance de la vue actuelle et "onClickView" pour créer une instance DeclaredOnClickListener, et défini comme écouteur de clics de la vue actuelle.

/**
     * An implementation of OnClickListener that attempts to lazily load a
     * named click handling method from a parent or ancestor context.
     */
private static class DeclaredOnClickListener implements OnClickListener {
        private final View mHostView;
        private final String mMethodName;

        private Method mMethod;

        public DeclaredOnClickListener(@NonNull View hostView, @NonNull String methodName) {
            mHostView = hostView;
            mMethodName = methodName;
        }

        @Override
        public void onClick(@NonNull View v) {
            if (mMethod == null) {
                mMethod = resolveMethod(mHostView.getContext(), mMethodName);
            }

            try {
                mMethod.invoke(mHostView.getContext(), v);
            } catch (IllegalAccessException e) {
                throw new IllegalStateException(
                        "Could not execute non-public method for android:onClick", e);
            } catch (InvocationTargetException e) {
                throw new IllegalStateException(
                        "Could not execute method for android:onClick", e);
            }
        }

        @NonNull
        private Method resolveMethod(@Nullable Context context, @NonNull String name) {
            while (context != null) {
                try {
                    if (!context.isRestricted()) {
                        return context.getClass().getMethod(mMethodName, View.class);
                    }
                } catch (NoSuchMethodException e) {
                    // Failed to find method, keep searching up the hierarchy.
                }

                if (context instanceof ContextWrapper) {
                    context = ((ContextWrapper) context).getBaseContext();
                } else {
                    // Can&#39;t search up the hierarchy, null out and fail.
                    context = null;
                }
            }

            final int id = mHostView.getId();
            final String idText = id == NO_ID ? "" : " with id &#39;"
                    + mHostView.getContext().getResources().getResourceEntryName(id) + "&#39;";
            throw new IllegalStateException("Could not find method " + mMethodName
                    + "(View) in a parent or ancestor Context for android:onClick "
                    + "attribute defined on view " + mHostView.getClass() + idText);
        }
}
Copier après la connexion

C'est clair ici. Lorsque l'on clique sur View, la méthode "onClick" de l'instance DeclaredOnClickListener sera appelée, puis la méthode "resolveMethod" sera appelée, en utilisant la réflexion pour la trouver. le contexte de la vue. Une méthode est appelée "onClickView". Cette méthode a un paramètre de type View Enfin, la méthode est appelée en utilisant la réflexion. Il convient de noter que la méthode "onClickView" doit être de type public, sinon une IllegalAccessException sera levée lors de l'appel de réflexion.

En même temps, il ressort du code source que la façon de définir l'événement de clic à l'aide de android:onClick est de trouver la méthode de rappel à partir du contexte, donc si vous créez une vue dans le XML du Fragment, vous ne pouvez pas utiliser cette méthode. Lier la méthode de rappel dans Fragment, car Fragment lui-même n'est pas un contexte, le contexte de la vue ici est en fait FragmentActivity, ce qui signifie également que cette méthode peut rapidement rappeler Fragment à FragmentActivity.

De plus, la fonction de android:onClick peut également être vue à partir des commentaires de la classe DeclaredOnClickListener joue principalement le rôle de chargement paresseux Uniquement lorsque vous cliquez sur View. saura quelle méthode il est utilisé pour le rappel de clic.

Enfin, ce qu'il faut ajouter, c'est qu'utiliser android:onClick pour définir un événement de clic pour View signifie ajouter une méthode publique sans interface à l'activité. La tendance actuelle du développement Android est "N'écrivez pas de logique métier dans la classe Activity". Ceci est bénéfique pour la maintenance du projet et empêche l'explosion de l'activité, alors essayez de ne pas avoir de méthodes publiques sans interface et sans cycle de vie dans Activity. Par conséquent, utiliser android:onClick à la hâte peut "polluer" l'Activité.


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment configurer le saut sur la page de connexion Layui Comment configurer le saut sur la page de connexion Layui Apr 04, 2024 am 03:12 AM

Étapes de configuration du saut de la page de connexion Layui : Ajouter un code de saut : ajoutez un jugement dans l'événement de clic sur le bouton de soumission du formulaire de connexion et accédez à la page spécifiée via window.location.href après une connexion réussie. Modifiez la configuration du formulaire : ajoutez un champ de saisie masqué à l'élément de formulaire de lay-filter="login", avec le nom "redirect" et la valeur étant l'adresse de la page cible.

Comment ajouter des événements tactiles aux images dans vue Comment ajouter des événements tactiles aux images dans vue May 02, 2024 pm 10:21 PM

Comment ajouter un événement de clic à une image dans Vue ? Importez l'instance Vue. Créez une instance Vue. Ajoutez des images aux modèles HTML. Ajoutez des événements de clic à l'aide de la directive v-on:click. Définissez la méthode handleClick dans l'instance Vue.

Développement du langage Hongmeng HarmonyOS et Go Développement du langage Hongmeng HarmonyOS et Go Apr 08, 2024 pm 04:48 PM

Introduction au développement du langage HarmonyOS et Go HarmonyOS est un système d'exploitation distribué développé par Huawei, et Go est un langage de programmation moderne. La combinaison des deux offre une solution puissante pour développer des applications distribuées. Cet article présentera comment utiliser le langage Go pour le développement dans HarmonyOS et approfondira sa compréhension à travers des cas pratiques. Installation et configuration Pour utiliser le langage Go pour développer des applications HarmonyOS, vous devez d'abord installer GoSDK et HarmonyOSSDK. Les étapes spécifiques sont les suivantes : #Install GoSDKgogetgithub.com/golang/go#Set PATH

Quel est le mécanisme événementiel des fonctions C++ en programmation concurrente ? Quel est le mécanisme événementiel des fonctions C++ en programmation concurrente ? Apr 26, 2024 pm 02:15 PM

Le mécanisme événementiel de la programmation simultanée répond aux événements externes en exécutant des fonctions de rappel lorsque des événements se produisent. En C++, le mécanisme événementiel peut être implémenté avec des pointeurs de fonction : les pointeurs de fonction peuvent enregistrer des fonctions de rappel à exécuter lorsque des événements se produisent. Les expressions Lambda peuvent également implémenter des rappels d'événements, permettant la création d'objets fonction anonymes. Le cas réel utilise des pointeurs de fonction pour implémenter des événements de clic sur un bouton de l'interface graphique, appelant la fonction de rappel et imprimant des messages lorsque l'événement se produit.

Explication détaillée de l'obtention par JavaScript d'éléments de page Web Explication détaillée de l'obtention par JavaScript d'éléments de page Web Apr 09, 2024 pm 12:45 PM

Réponse : JavaScript fournit diverses méthodes pour obtenir des éléments de page Web, notamment l'utilisation d'identifiants, de noms de balises, de noms de classes et de sélecteurs CSS. Description détaillée : getElementById(id) : obtient des éléments basés sur un identifiant unique. getElementsByTagName(tag) : obtient le groupe d'éléments avec le nom de balise spécifié. getElementsByClassName(class) : obtient le groupe d'éléments avec le nom de classe spécifié. querySelector(selector) : utilisez le sélecteur CSS pour obtenir le premier élément correspondant. querySelectorAll (sélecteur) : obtenez toutes les correspondances à l'aide du sélecteur CSS

Pourquoi l'événement click dans js ne peut-il pas être exécuté à plusieurs reprises ? Pourquoi l'événement click dans js ne peut-il pas être exécuté à plusieurs reprises ? May 07, 2024 pm 06:36 PM

Les événements de clic en JavaScript ne peuvent pas être exécutés à plusieurs reprises en raison du mécanisme de propagation des événements. Pour résoudre ce problème, vous pouvez prendre les mesures suivantes : Utiliser la capture d'événement : Spécifiez un écouteur d'événement à déclencher avant que l'événement ne se déclenche. Remise des événements : utilisez event.stopPropagation() pour arrêter le bouillonnement des événements. Utilisez une minuterie : déclenchez à nouveau l'écouteur d'événements après un certain temps.

Comment utiliser les fonctions PHP pour traiter des données XML ? Comment utiliser les fonctions PHP pour traiter des données XML ? May 05, 2024 am 09:15 AM

Utilisez les fonctions PHPXML pour traiter les données XML : Analyser les données XML : simplexml_load_file() et simplexml_load_string() chargent des fichiers ou des chaînes XML. Accéder aux données XML : utilisez les propriétés et les méthodes de l'objet SimpleXML pour obtenir les noms d'éléments, les valeurs d'attribut et les sous-éléments. Modifier les données XML : ajoutez de nouveaux éléments et attributs à l'aide des méthodes addChild() et addAttribute(). Données XML sérialisées : la méthode asXML() convertit un objet SimpleXML en chaîne XML. Exemple pratique : analyser le flux de produits XML, extraire les informations sur le produit, les convertir et les stocker dans une base de données.

Que signifie div en CSS Que signifie div en CSS Apr 28, 2024 pm 02:21 PM

Un DIV en CSS est un séparateur ou un conteneur de documents utilisé pour regrouper du contenu, créer des mises en page, ajouter du style et de l'interactivité. En HTML, l'élément DIV utilise la syntaxe <div></div>, où div représente un élément auquel des attributs et du contenu peuvent être ajoutés. DIV est un élément de niveau bloc qui occupe une ligne entière dans le navigateur.

See all articles