Android remplaçant onClick (View v) - existe-t-il une bonne solution à utiliser pour tous les boutons d'une application

StackOverflow https://stackoverflow.com//questions/9640308

Question

Comme vous le savez, nous pouvons remplacer quelques méthodes pour chaque type de vue que nous avons créé.Je ne fais aucun code de mise en page XML car beaucoup de choses changent au moment de l'exécution et certaines choses sont créées dynamiquement, donc la solution programmatique est la meilleure voie pour moi ici.

Donc, pour aller au fond de mon problème, disons que j'ai 50 boutons dans mon application Android.Ces boutons pourraient potentiellement se trouver sur une seule activité, mais pourraient très probablement s'étendre sur plusieurs écrans (activités).

J'ai créé une classe de bouton appelée CustomButton qui remplace la méthode onClick(View view).Que se passe-t-il si certains boutons sont censés effectuer une action (disons qu'ils font partie d'une disposition linéaire) et que d'autres font partie de quelque chose comme une disposition relative et dans chaque disposition relative, vous souhaitez obtenir des informations sur la disposition relative de ce bouton. réside dans (peut-être que vous voulez obtenir des informations sur toutes les vues de texte dans la même disposition relative, etc.).

Bien sûr, une solution est que vous puissiez obtenir l'ID de chaque bouton et effectuer un changement (cas) ou quelque chose du genre et en fonction de l'ID du bouton renvoyé, vous pouvez faire quelque chose.Le problème est que j'ai 50 boutons.Et si j'en avais 200 ?Dois-je vraiment effectuer 200 vérifications de cas dans ma déclaration de changement pour déterminer quelle action je dois entreprendre ?

J'essaie donc de comprendre quelles informations sont disponibles dont je ne suis pas au courant et que je pourrais utiliser lors du remplacement de onClick.

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    if(!getClickInfo()){
        ((CustomButton)v).setText("I clicked the button");
        setClickInfo(true);
    }
    else{
        isClicked = false;
        ((CustomButton)v).setText("This is the button that i want to click");


    }

}

voici donc un exemple.J'ai passé la vue qui représente le bouton sur lequel vous avez cliqué et je peux modifier le texte du bouton en cliquant dessus encore et encore.Mais et si le Button faisait partie d’une disposition relative ?Puis-je obtenir d'autres informations sur d'autres vues qui font également partie de la même disposition relative ?Et si je voulais changer la couleur d'arrière-plan de certains boutons à chaque fois que je clique dessus au lieu de changer le texte ?Si j'ai un nombre X de boutons, j'essaie d'éviter de créer un nombre X d'identifiants - comme je l'ai souligné, vous pourriez potentiellement en avoir des centaines.

Je me demandais si quelqu'un pourrait avoir des idées sur ce qui serait un meilleur itinéraire ici que d'avoir un nombre potentiellement illimité de vérifications de cas dans une instruction switch.Si je pouvais découvrir de quelle vue provenait le bouton (dans mon cas, le bouton faisait partie d'une vue extérieure), je pourrais alors modifier mes vues au lieu de simplement mes boutons - et rendre mon instruction switch beaucoup moins lourde et plus facile à utiliser. maintenir.merci.

Était-ce utile?

La solution

Je ne suis pas sûr que votre objectif final est.Mais à partir de votre vue (bouton), vous pouvez obtenir son parent (par exemple, un relativelayouout).Ensuite, une fois que vous avez votre groupe de vue, vous pouvez obtenir ses enfants et faire tout ce dont vous avez besoin.

Par exemple:

@Override
public void onClick(View v) {
    ViewParent parent = v.getParent();
    if (parent instanceof RelativeLayout) {
        // your button is inside a RelativeLayout
        RelativeLayout rl = (RelativeLayout) parent;
        int numChildren = rl.getChildCount();
        // loop through children if you need to (use rl.getChildAt(index) to get each child)
        ...
    }
}

Si vous n'avez pas besoin de savoir s'il s'agit d'une relativation ou d'une linearlayout, ou tout ce qui explique simplement le groupe de visit.

espère que cela aide.

Autres conseils

Si je vous comprends bien, vous pourriez simplement avoir quelques extensions CustomButton différentes :dire RelativeLayoutButton et LinearLayoutButton, et demandez-leur d'implémenter OnClickListener.Passer outre onClick() au sein de la classe étendue et gérer l’implémentation par type de bouton.

Vous pouvez accéder à l'intégralité de la hiérarchie des vues si nécessaire.Dites, quelque chose comme ceci :

//assuming a reference to Button button

//get a reference to the parent
View v = button.getParent();
ViewGroup parent;
ArrayList<View> siblings = new ArrayList<>();

if(v instanceof ViewGroup) parent = (ViewGroup) v;
for(int i = 0; i < parent.getChildCount(); i++) {
    siblings.add(parent.getChildAt(i));
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top